SORU
15 Kasım 2009, Pazar


Django auto_now ve auto_now_add

Django 1.1.

Benim models.py bu var:

class User(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

Bir satır güncellerken alıyorum:

[Sun Nov 15 02:18:12 2009] [error] /home/ptarjan/projects/twitter-meme/django/db/backends/mysql/base.py:84: Warning: Column 'created' cannot be null
[Sun Nov 15 02:18:12 2009] [error]   return self.cursor.execute(query, args)

Benim veritabanı ilgili kısım:

  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,

Bu endişeye neden oluyor?

Yan soru: admin benim aracında, bu iki alan görünmüyor. Bu beklenen bir şey mi?

CEVAP
15 Kasım 2009, Pazar


auto_now öznitelik kümesi ile herhangi bir alan da editable=False miras ve bu nedenle admin panelinde görünmeyecektir. Oldu konuşma geçmişi hakkında yapma auto_now auto_now_add argümanlar git, ve ancak onlar hala var, hissediyorum siz en iyisi sadece kullanarak bir özel save() yöntem.

Yani, bu işi yapmak için doğru, istiyorum tavsiye değil kullanarak auto_now auto_now_add ve tanımlamak yerine kendi save() yöntem için emin olun created yalnızca güncelleştirildi id ayarlı değil (gibi maddenin ilk oluşturulan), ve güncelleme modified Her zaman madde kurtardı.

Django kullanarak yazdığım diğer projeler ile aynı şeyi yaptım, ve bu yüzden save() bu gibi görünecektir:

from django.util import timezone

class User(models.Model):
    created     = models.DateTimeField(editable=False)
    modified    = models.DateTimeField()

    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''
        if not self.id:
            self.created = timezone.now()
        self.modified = timezone.now()
        return super(User, self).save(*args, **kwargs)

Bu yardımcı olur umarım!

Yorumlarına yanıt olarak düzenlemek:

Ben sadece save() vs Bu alan güvenerek bağımsız aşırı sadık sebebi iki yönlüdür:

  1. Onların güvenilirliği ile söz konusu iniş ve çıkışlar. Bu argümanlar Django ile nasıl konuşulacağını bilen veritabanı her tür zaman/tarih damgası alanı davranır ve kırılma ve/görünüyor yolda ağır güvenen ya da her yayın arasında değişiyor. Tamamen kaldırılması için çağrı arkasındaki itici güç olduğuna inanıyorum.
  2. Onlar sadece DateField, DateTimeField ve TimeField ve bu tekniği kullanarak otomatik olarak herhangi bir alan türü her zaman bir öğe doldurmak için mümkün olduğu gerçeğini kaydedilir.
  3. TZ-farkında ya da saf datetime.datetime bir nesne settings.USE_TZ bağlı olarak döner çünkü *22 vs* 21 ** kullanın.

OP hata gördüm neden adresi tam olarak bilmiyorum ama created bile, auto_now_add=True olmasına rağmen kalabalık olmak değil gibi görünüyor. Bir hata gibi duruyor, ve benim küçük paket üzerinde ürün #1 çizgi bana: auto_now auto_now_add en iyi lapa lapa.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS

    ASUS

    22 EKİM 2005
  • TheJoeycool2010

    TheJoeycool2

    12 Temmuz 2010
  • Ty Moss

    Ty Moss

    20 Kasım 2007