En django, ¿los modelos tienen un campo de marca de tiempo predeterminado?


90

En django, ¿hay un campo de marca de tiempo predeterminado para todos los objetos? Es decir, ¿tengo que declarar explícitamente un campo de 'marca de tiempo' para 'creado en' en mi modelo, o hay alguna manera de obtener esto automágicamente?

Respuestas:


175

No existe tal cosa por defecto, pero agregar uno es muy fácil. Simplemente use el auto_now_addparámetro en la DateTimeFieldclase:

created = models.DateTimeField(auto_now_add=True)

También puede utilizar auto_nowpara un campo "actualizado en". Compruebe el comportamiento de auto_now aquí .

Por auto_now_add aquí .

Un modelo con ambos campos se verá así:

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

32

Automágicamente no suena como algo que django haría por defecto. No le obligaría a solicitar una marca de tiempo.

Construiría una clase base abstracta y heredaría todos los modelos de ella si no quiere olvidarse de la marca de tiempo / nombre de campo, etc.

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

     class Meta:
         abstract = True

No parece mucho importar en wherever.TimeStampedModellugar dedjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
También hay model_utilspara Django que ya lo contiene TimeStampedModel, pero si no necesita nada más de este paquete, manténgalo sin peso adicional.
boldnik

@boldnik Soy fanático de la sencillez.
Yuji 'Tomita' Tomita

Muy bien ... Tengo 3 clases que necesitaban una marca de tiempo para createdy updated. Esta es una excelente manera de hacerlo de manera limpia.
ron_g


5

Puedes probar django-extensions

si desea utilizar el modelo abstracto de marca de tiempo

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Tiene otros modelos abstractos. también puedes usar eso.


2

Si desea poder modificar este campo, establezca lo siguiente en lugar de auto_now_add=True:

Para la fecha

from datetime import date

models.DateField(default=date.today)

Para DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

Creo que iría con

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

Necesito algunas aclaraciones sobre el uso

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

    class Meta:
         abstract = True
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.