SORU
21 EYLÜL 2011, ÇARŞAMBA


Geçici olarak devre dışı auto_now / auto_now_add

Böyle bir model var:

class FooBar(models.Model):
    createtime = models.DateTimeField(auto_now_add=True)
    lastupdatetime = models.DateTimeField(auto_now=True)

Bazı model örnekleri (veri taşırken kullanılan) için iki tarih alanları üzerine yazmak istiyorum. Geçerli çözüm bu gibi görünüyor:

for field in new_entry._meta.local_fields:
    if field.name == "lastupdatetime":
        field.auto_now = False
    elif field.name == "createtime":
        field.auto_now_add = False

new_entry.createtime = date
new_entry.lastupdatetime = date
new_entry.save()

for field in new_entry._meta.local_fields:
    if field.name == "lastupdatetime":
        field.auto_now = True
    elif field.name == "createtime":
        field.auto_now_add = True

Daha iyi bir çözüm var mı?

CEVAP
21 EYLÜL 2011, ÇARŞAMBA


Gerçekten şu ankinden daha farklı bir şekilde auto_now/auto_now_add devre dışı bırakabilirsiniz. Eğer esneklik değiştirmek istiyorsanız, bu değerler, auto_now/auto_now_add en iyi seçenek değildir. Sık sık default kullanım ve/veya nesne kaydedilmeden önce düzenleme yapmak için save() yöntemi geçersiz kılmak için daha esnektir.

default save() geçersiz kılınmış bir yöntemi kullanarak, bu sorunu çözmek için tek yol bu gibi modelinizi tanımlamak için:

class FooBar(models.Model):
    createtime = models.DateTimeField(default=datetime.datetime.now)
    lastupdatetime = models.DateTimeField()

    def save(self, *args, **kwargs):
        if not kwargs.pop('skip_lastupdatetime', False):
            self.lastupdatetime = datetime.datetime.now()

        super(FooBar, self).save(*args, **kwargs)

Otomatik lastupdatetime değişikliği atlamak istediğiniz yere kod, sadece kullanın

new_entry.save(skip_lastupdatetime=True)

Eğer nesne yönetici arayüzü veya başka bir yerde kayıtlı ise, Kaydet() skip_lastupdatetime argüman olmadan, ve auto_now ile daha önce yaptığı gibi davranacaktır. çağrılacaktır

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eurotuner

    eurotuner

    6 Mart 2006
  • Kontor.TV

    Kontor.TV

    14 Mart 2006
  • xdadevelopers

    xdadeveloper

    25 Aralık 2009