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
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:
- 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.
- 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.
- TZ-farkında ya da saf
datetime.datetime
bir nesnesettings.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.
Geçici olarak devre dışı auto_now / au...
Django üzerinde permission_required de...
İşleme nesneleri bir Ajax çağrısından ...
Django: Jinja2 Geçiş?...
Django Güney - tablo zaten var...