Dans django, les modèles ont-ils un champ d'horodatage par défaut?


89

Dans django, existe-t-il un champ d'horodatage par défaut pour tous les objets? Autrement dit, dois-je déclarer explicitement un champ «horodatage» pour «créé le» dans mon modèle - ou y a-t-il un moyen de l'obtenir automatiquement?

Réponses:


170

Rien de tel par défaut, mais en ajouter un est très simple. Utilisez simplement le auto_now_addparamètre dans la DateTimeFieldclasse:

created = models.DateTimeField(auto_now_add=True)

Vous pouvez également utiliser auto_nowpour un champ «mis à jour le». Vérifiez le comportement d' auto_now ici .

Pour auto_now_add ici .

Un modèle avec les deux champs ressemblera à ceci:

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

32

Automagically ne ressemble pas à quelque chose que Django ferait par défaut. Cela ne vous obligerait pas à exiger un horodatage.

Je construirais une classe de base abstraite et en hériterais tous les modèles si vous ne voulez pas oublier l'horodatage / le nom de champ, etc.

class TimeStampedModel(models.Model):
     created_on = models.DateTimeField(auto_now_add=True)

     class Meta:
         abstract = True

Cela ne semble pas beaucoup d'importer wherever.TimeStampedModelau lieu dedjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
Il y a aussi model_utilspour Django qui contient déjà TimeStampedModel, mais si vous n'avez besoin de rien d'autre de ce paquet, gardez-le simplement sans poids supplémentaire.
boldnik

@boldnik Je suis fan de la simplicité.
Yuji 'Tomita' Tomita

Assez cool ... J'ai 3 classes qui avaient besoin d'un horodatage pour createdet updated. C'est une excellente façon de le faire proprement.
ron_g


5

Vous pouvez essayer django-extensions

si vous souhaitez utiliser un modèle abstrait d'horodatage

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Il a d'autres modèles abstraits. vous pouvez également l'utiliser.


2

Si vous souhaitez pouvoir modifier ce champ, définissez ce qui suit au lieu de auto_now_add=True:

Pour la date

from datetime import date

models.DateField(default=date.today)

Pour DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

Je pense que j'irais avec

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

J'ai besoin de quelques éclaircissements sur l'utilisation

class TimeStampedModel(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
         abstract = True
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.