web-dev-qa-db-fra.com

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

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éé sur' dans mon modèle - ou existe-t-il un moyen l'obtenir automatiquement?

77
9-bits

Rien de tel par défaut, mais en ajouter un est très facile. Utilisez simplement le paramètre auto_now_add Dans la classe DateTimeField:

created = models.DateTimeField(auto_now_add=True)

Vous pouvez également utiliser auto_now Pour un champ "mis à jour le". Vérifiez le comportement de auto_nowici .

Pour auto_now_addici .

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)
133
MoshiBin

Automagiquement, cela ne ressemble pas à quelque chose que Django ferait par défaut. Cela ne vous obligerait pas à demander un horodatage.

Je construirais une classe de base abstraite et en hériterais tous les modèles si vous ne voulez pas oublier timestamp/fieldname, etc.

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

     class Meta:
         abstract = True

Il ne semble pas y avoir grand chose à importer wherever.TimeStampedModel au lieu de Django.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....
28

Si vous utilisez Django-extensions (qui est une bonne application pour ajouter des fonctionnalités à l’assistant de ligne de commande Django-admin.py), vous pouvez obtenir ces champs de modèle gratuitement en héritant de leur TimeStampedModel ou en utilisant leurs champs TimeStamp personnalisés

13
Timmy O'Mahony

Vous pouvez essayer Django-extensions

si vous voulez 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 l'utiliser aussi.

4
Gaurav

Si vous voulez 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)
1
chaggy

Je pense que j'irais avec

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

J'ai besoin de précisions sur l'utilisation

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

    class Meta:
         abstract = True
0
Omodamola Oladeji