Quelle est la meilleure façon de définir automatiquement une date de création pour un objet, ainsi qu'un champ qui enregistrera la dernière mise à jour de l'objet?
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')
J'obtiens l'erreur:
objects_object.created_at may not be NULL
Dois-je définir manuellement cette valeur moi-même? Je pensais que c'était le but des paramètres passés à DateTimeField
(ou sont-ils juste des valeurs par défaut, et depuis que j'ai défini, editable=False
ils ne sont pas affichés sur le formulaire, donc ne sont pas soumis dans la demande, et donc mettre dans le formulaire?).
Quelle est la meilleure façon de procéder? Une __init__
méthode?
python
django
django-models
Roger
la source
la source
auto_now
etauto_now_add
sont considérés comme mauvais, alors essayez de les éviter. Cette réponse explique pourquoi et fournit une meilleure approche, supplantant lasave()
méthode.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
ouauto_now
fonctionne très bien. Il définit le champ avant d'enregistrer le modèle ( github.com/django/django/blob/stable/3.0.x/django/db/models/… ).Eh bien, la réponse ci-dessus est correcte, auto_now_add et auto_now le feraient, mais il serait préférable de créer une classe abstraite et de l'utiliser dans n'importe quel modèle où vous avez besoin
created_at
et desupdated_at
champs.Maintenant, partout où vous voulez l'utiliser, vous pouvez faire un héritage simple et vous pouvez utiliser l'horodatage dans n'importe quel modèle que vous aimez.
De cette façon, vous pouvez tirer parti de la réutilisabilité orientée objet, dans Django DRY (ne vous répétez pas)
la source