96 votes

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 "timestamp" pour "created on" dans mon modèle ou existe-t-il un moyen de l'obtenir automatiquement ?

208voto

Ralf Points 11

Cette fonction n'existe pas par défaut, mais il est très facile d'en ajouter une. Il suffit d'utiliser le auto_now_add dans les DateTimeField classe :

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_now ici .

Pour auto_now_add ici .

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

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

37voto

Yuji 'Tomita' Tomita Points 46106

Automatiquement ne semble pas être quelque chose que django ferait par défaut. Il ne vous obligerait pas à exiger un horodatage.

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

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

     class Meta:
         abstract = True

Cela ne semble pas beaucoup pour importer wherever.TimeStampedModel au lieu de django.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2 votes

Il existe également model_utils pour Django qui contient déjà TimeStampedModel Mais si vous n'avez besoin de rien d'autre dans ce paquet, gardez-le sans poids supplémentaire.

0 votes

@boldnik Je suis un fan de la simplicité.

0 votes

Plutôt cool... J'ai 3 classes qui avaient besoin d'un timestamp pour created y updated . C'est un excellent moyen de le faire proprement.

14voto

Timmy O'Mahony Points 23071

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 leur champs personnalisés TimeStamp

5voto

Wagh Points 128

Vous pouvez essayer django-extensions

si vous voulez utiliser le modèle abstrait d'horodatage

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Il existe d'autres modèles abstraits. Vous pouvez aussi les utiliser.

2voto

chaggy Points 552

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X