Каков наилучший способ автоматически установить дату создания объекта, а также поле, которое будет записывать время последнего обновления объекта?
models.py:
created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)
views.py:
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.save()
return HttpResponseRedirect('obj_list')
Я получаю ошибку:
objects_object.created_at may not be NULL
Нужно ли вручную устанавливать это значение? Я думал, что это точка параметров, передаваемых DateTimeField
(или они являются просто значениями по умолчанию, и, поскольку я установил, editable=False
они не отображаются в форме, следовательно, не отправляются в запросе и, следовательно, не получают положить в форму?).
Какой лучший способ сделать это? __init__
Метод?
python
django
django-models
Роджер
источник
источник
auto_now
иauto_now_add
считаются злом, поэтому старайтесь избегать их. Этот ответ объясняет почему и обеспечивает лучший подход, переопределяяsave()
метод.You are trying to add a non-nullable field 'created_at' to gameuser without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 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 The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now() >>> timezone.now()
auto_now_add
илиauto_now
работает просто отлично. Он устанавливает поле перед сохранением модели ( github.com/django/django/blob/stable/3.0.x/django/db/models/… ).Что ж, приведенный выше ответ правильный, auto_now_add и auto_now сделали бы это, но было бы лучше создать абстрактный класс и использовать его в любой модели, где вам нужны поля
created_at
иupdated_at
поля.Теперь, где бы вы ни захотели его использовать, вы можете делать простое наследование, и вы можете использовать метку времени в любой модели, которую вам нравится.
Таким образом, вы можете использовать объектно-ориентированное повторное использование в Django DRY (не повторяйтесь)
источник