No Django os modelos têm um campo de carimbo de data / hora padrão?


89

No django - existe um campo de carimbo de data / hora padrão para todos os objetos? Ou seja, eu tenho que declarar explicitamente um campo 'timestamp' para 'criado em' no meu modelo - ou há uma maneira de fazer isso de forma automática?

Respostas:


170

Não existe tal coisa por padrão, mas adicionar um é super fácil. Basta usar o auto_now_addparâmetro na DateTimeFieldclasse:

created = models.DateTimeField(auto_now_add=True)

Você também pode usar auto_nowpara um campo 'atualizado em'. Verifique o comportamento auto_now daqui .

Por auto_now_add aqui .

Um modelo com ambos os campos terá a seguinte aparência:

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

32

Automagicamente não soa como algo que django faria por padrão. Não forçaria você a exigir um carimbo de data / hora.

Eu construiria uma classe base abstrata e herdaria todos os modelos dela se você não quiser se esquecer do timestamp / fieldname, etc.

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

     class Meta:
         abstract = True

Não parece muito para importar em wherever.TimeStampedModelvez dedjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
Existe também model_utilspara Django que já contém TimeStampedModel, mas se você não precisa de mais nada deste pacote, apenas mantenha-o sem peso extra.
boldnik

@boldnik sou um fã da simplicidade.
Yuji 'Tomita' Tomita

Muito legal ... Eu tenho 3 classes que precisam de um carimbo de data / hora para createde updated. Esta é uma ótima maneira de fazer isso de forma limpa.
ron_g


5

Você pode tentar extensões django

se você quiser usar um modelo abstrato de carimbo de data / hora

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Possui outros modelos abstratos. você pode usar isso também.


2

Se você quiser ser capaz de modificar este campo, defina o seguinte em vez de auto_now_add=True:

Para Data

from datetime import date

models.DateField(default=date.today)

Para DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

Acho que iria com

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

Eu preciso de alguns esclarecimentos sobre como usar

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

    class Meta:
         abstract = True
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.