#django-models #django-rest-framework
Вопрос:
Я хочу добавить поле created_by и updated_by во все мои объекты БД. Я создал для этого общую модель, которая будет использоваться большинством других объектов. До сих пор я разобрался с большинством препятствий. Но сценарий выполнения миграции заканчивается ошибкой:
Моя модель:
class CommonModel(models.Model): """Common fields that are shared among all models.""" created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT, editable=False, related_name=" ") updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT, editable=False, related_name=" ") created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True, editable=False) class Meta: abstract = True class Tag(CommonModel): """Tag to be used for device type""" name = models.CharField(max_length=255) def __str__(self): return self.name
Ошибка, которую я получаю, такова :
Вы пытаетесь добавить ненулевое поле «created_by» в тип устройства без значения по умолчанию; мы не можем этого сделать (базе данных нужно что-то для заполнения существующих строк). Пожалуйста, выберите исправление:
- Теперь укажите одноразовое значение по умолчанию (будет установлено для всех существующих строк с нулевым значением для этого столбца).
- Выйдите и позвольте мне добавить значение по умолчанию в models.py
Единственное «решение», которое я нашел в Интернете, состояло в том, чтобы определить значение по умолчанию=», снова запустить изменения, а затем вручную отредактировать файлы, чтобы удалить значение по умолчанию=». Я не могу поверить, что это правильный способ сделать это и что для этого пока нет решения.
Комментарии:
1. Это не ошибка. Он просто спрашивает, что ему следует делать с
created_by
существующими записями.default=''
вообще не имеет смысла: это строка,ForeignKey
которая принимает только пользовательский объект или первичный ключ пользовательского объекта.
Ответ №1:
Вам нужно установить значение по умолчанию для created_at
и update_at
, поскольку это не null=True
так .
Сообщение, которое вы получаете во время миграции, не является ошибкой. Если вы хотите указать значение по умолчанию, выберите исправить 1.
, оно должно отображать приведенное ниже приглашение,
Please enter the default value now, as valid Python The datetime and ` modules are available, so you can do e.g. timezone.now Type 'exit' to exit this prompt gt;gt;gt;
Здесь вы можете установить значение по умолчанию с помощью модуля datetime
или django.utils.timezone
.
Комментарии:
1. Спасибо тебе и Уильяму. Я не осознавал, что не очистил базу данных во время тестирования приложения.