¿Cuál es la mejor manera de establecer una fecha de creación para un objeto automáticamente, y también un campo que registrará cuándo se actualizó el objeto por última vez?
modelos.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')
Me sale el error:
objects_object.created_at may not be NULL
¿Tengo que configurar este valor manualmente yo mismo? Pensé que ese era el punto de los parámetros pasados a DateTimeField
(o son solo valores predeterminados, y desde que lo configuré editable=False
no se muestran en el formulario, por lo tanto, no se envían en la solicitud y, por lo tanto, no se obtienen poner en el formulario?).
¿Cuál es la mejor manera de hacer esto? Un __init__
metodo?
python
django
django-models
Roger
fuente
fuente
auto_now
yauto_now_add
son considerados malvados, así que trata de evitarlos. Esta respuesta explica por qué y proporciona un mejor enfoque, anulando elsave()
método.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
oauto_now
funciona bien. Establece el campo antes de guardar el modelo ( github.com/django/django/blob/stable/3.0.x/django/db/models/… ).Bueno, la respuesta anterior es correcta, auto_now_add y auto_now lo harían, pero sería mejor hacer una clase abstracta y usarla en cualquier modelo que requiera
created_at
yupdated_at
campos.Ahora, en cualquier lugar que desee usar, puede hacer una herencia simple y puede usar la marca de tiempo en cualquier modelo que haga.
De esta manera, puede aprovechar la reutilización orientada a objetos, en Django DRY (no se repita)
fuente