В Django 1.8 Миграция. Добавление поля DateTimeField после создания БД. Передовая практика?

Итак, через пару миграций после моей первой, я решил, что хочу включить эти поля:

created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)

в одной из моих моделей. Когда Я ... --3--> Он дал мне You are trying to add a non-nullable field 'created' to episode without a default; we can't do that (the database needs something to populate existing rows).

поэтому я изменил его на

created = models.DateTimeField(auto_now_add=True, default=datetime.now)

после попытки makemigrations опять же, он сказал, что at_api.Episode.modified: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present.

хорошо, поэтому я просто пошел вперед и удалил auto_now_add

created = models.DateTimeField(default=datetime.now)

теперь я мог бы makemigrations без каких-либо проблем. И потом я удалено default=datetime.now и заменить auto_now_add=True и опять перенесены без каких-либо проблем. Тем не менее, я не могу не чувствовать, что это может быть не лучший способ делать вещи. Я чувствую, что что-то может пойти не так, позже в проекте.

2 ответов


Я думаю, лучше всего было бы сделать nullable поля. Какой ваш created поле означает в данный момент: "время, когда экземпляр был создан,или произвольное время, когда я запустил миграцию."Стандартный способ представления отсутствия ценности -NULL, а не произвольное значение.

тем не менее, если вы хотите использовать какое-то произвольное значение, вам просто нужно сказать Django, что это такое. Обычно makemigrations дает вам возможность указать одноразовое значение для использования для существующих строк-разве этого не произошло?

более трудоемким методом было бы объявить поле nullable, затем создать миграцию данных для заполнения желаемого значения, а затем сделать его ненулевым. То, что вы сделали-это упрощенная версия. Я не вижу, чтобы это создавало какие-либо проблемы, кроме проблемы created Не время создания экземпляра.


у меня только что была точная проблема. Я использую Django 1.10. Я прочитал ответ Кевина, и я попытался поставить значение по умолчанию, когда Django попросил меня заполнить его как datetime.now строку. И я был удивлен, потому что для этих полей Django автоматически спросит вас, Хотите ли вы использовать datetime.now по умолчанию:

$ ./manage.py makemigrations
You are trying to add the field 'date_created' with 'auto_now_add=True' to projectasset without a default; the database needs something to populate existing rows.

 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value.
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
[default: timezone.now] >>>

Итак, я просто подтверждаю это, и все, кажется, работает нормально!