In django i modelli hanno un campo timestamp predefinito?


91

In django, esiste un campo timestamp predefinito per tutti gli oggetti? Cioè, devo dichiarare esplicitamente un campo "timestamp" per "creato il" nel mio modello - o c'è un modo per ottenerlo automaticamente?

Risposte:


178

Nessuna cosa del genere per impostazione predefinita, ma aggiungerne uno è semplicissimo. Usa semplicemente il auto_now_addparametro nella DateTimeFieldclasse:

created = models.DateTimeField(auto_now_add=True)

Puoi anche utilizzare auto_nowper un campo "aggiornato su". Controlla il comportamento di auto_now qui .

Per auto_now_add qui .

Un modello con entrambi i campi sarà simile a questo:

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

33

Automagicamente non suona come qualcosa che django farebbe di default. Non ti costringerebbe a richiedere un timestamp.

Creerei una classe base astratta e erediterei tutti i modelli da essa se non vuoi dimenticare il timestamp / fieldname, ecc.

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

     class Meta:
         abstract = True

Non sembra molto da importare wherever.TimeStampedModelinvece didjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
C'è anche model_utilsper Django che contiene già TimeStampedModel, ma se non hai bisogno di nient'altro da questo pacchetto, tienilo senza peso extra.
boldnik

@boldnik Sono un fan della semplicità.
Yuji 'Tomita' Tomita

Abbastanza interessante ... ho 3 classi che avevano bisogno di un timestamp per createde updated. Questo è un ottimo modo per farlo in modo pulito.
ron_g


5

Puoi provare django-extensions

se si desidera utilizzare il modello astratto timestamp

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Ha altri modelli astratti. puoi usare anche quello.


2

Se vuoi essere in grado di modificare questo campo, imposta quanto segue invece di auto_now_add=True:

Per la data

from datetime import date

models.DateField(default=date.today)

Per DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

Penso che andrei con

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

Ho bisogno di alcuni chiarimenti sull'utilizzo

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

    class Meta:
         abstract = True
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.