Django'da modellerin varsayılan bir zaman damgası alanı var mı?


91

Django'da - tüm nesneler için varsayılan bir zaman damgası alanı var mı? Yani, Modelimde 'oluşturulma tarihi' için açıkça bir 'zaman damgası' alanı beyan etmem gerekiyor mu - yoksa bunu otomatik olarak elde etmenin bir yolu var mı?

Yanıtlar:


178

Varsayılan olarak böyle bir şey yoktur, ancak bir tane eklemek çok kolaydır. Sadece sınıftaki auto_now_addparametreyi kullanın DateTimeField:

created = models.DateTimeField(auto_now_add=True)

Ayrıca auto_nowbir 'güncelleme tarihi' alanı için de kullanabilirsiniz . auto_now Buradaki davranışını kontrol edin .

İçin auto_now_add burada .

Her iki alana sahip bir model şu şekilde görünecektir:

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

33

Otomatik olarak django'nun varsayılan olarak yapacağı bir şey gibi görünmüyor. Sizi bir zaman damgası istemeye zorlamaz.

Zaman damgasını / alan adını vb. Unutmak istemiyorsanız, soyut bir temel sınıf oluşturur ve ondan tüm modelleri miras alırdım.

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

     class Meta:
         abstract = True

Bunun wherever.TimeStampedModelyerine içe aktarmak pek bir şey gibi görünmüyordjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
model_utilsZaten içeren Django için de var TimeStampedModel, ancak bu paketten başka bir şeye ihtiyacınız yoksa, sadece ekstra ağırlık olmadan saklayın.
boldnik

@boldnik Ben bir sadelik hayranıyım.
Yuji 'Tomita' Tomita

Oldukça havalı ... createdve için zaman damgasına ihtiyaç duyan 3 sınıfım var updated. Bu, temiz bir şekilde yapmanın harika bir yoludur.
ron_g


5

Django uzantılarını deneyebilirsiniz

zaman damgalı soyut model kullanmak istiyorsanız

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

Başka soyut modellere sahiptir. bunu da kullanabilirsin.


2

Bu alanı değiştirebilmek istiyorsanız, bunun yerine aşağıdakini ayarlayın auto_now_add=True:

Tarih için

from datetime import date

models.DateField(default=date.today)

DateTime için

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

Sanırım birlikte giderdim

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

Kullanımla ilgili bazı açıklamalara ihtiyacım var

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

    class Meta:
         abstract = True
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.