2016-09-06 15 views
6

Model alanlarının toplamını döndürmesi gereken bazı modellerle çalışıyorum. Modeldeki kaydetme yöntemini geçersiz kılmak veya sadece toplamı döndüren özel bir yöntem oluşturmak daha iyidir. Çözümlerden herhangi biriyle ilgili performans sorunu var mı?Django modeli, Özellik yöntemiyle kaydetme yöntemini veya özel yöntemi geçersiz kılma

Seçenek 1: Kaydetme yöntemini geçersiz kılma.

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    sum_integers = models.IntegerField() 

    def save(self, *args, **kwargs): 
     self.sum_integers = sum(
      [self.integer1, self.integer2, self.integer3]) 
     self.sum_integers.save() 
     return super(SomeModel, self).save(*args, **kwargs) 

Seçenek 2: Özel yöntemi yanıt, sum_integers kullanacağız şekilde bağlıdır

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    @property 
    def sum_integers(self): 
     return sum([self.integer1, self.integer2, self.integer3]) 

cevap

2

. DB'de bir alan olarak tutarsanız, bir sorgulama yapabilirsiniz ve mülk ile çok zor olurdu. Öte yandan

, bir sorgu yapacak değilse ve bu veri sizin için değil değerli yapar (başka bir deyişle - veri temsili olarak sum_integers gerekir) o zaman özelliğiyle gitmeli . uygulama performansı açısından

: Eğer nesneler binlerce karmaşık işlemleri yapacağız ise - o birkaç kez denir eğer cached_property için sütundaki değeri ya da en azından değişim özelliği depolamak için daha iyi olabilir .

Özet olarak, DB sütunundaki toplamın depolama değeri daha evrenseldir ve herhangi bir not düşümü yoktur, ancak bazı durumlarda property yaklaşımı, veri modelinizi daha temiz tutmanıza ve diskinizde bir miktar yer kalmasına olanak tanır.

Umarım sorunuza bir cevaptır. Bir şey belirsiz ise lütfen soru sormak için ücretsiz doldurun.

+0

Teşekkürler, artıları ve eksileri hakkında güzel bir açıklama. – Andreas

2

Alanları daha fazla güncellemeniz veya toplamı daha fazla çağırmanız gerekip gerekmediğine bağlı olarak değişir.

Bunu daha genel hale getirmek için, işlemin yalnızca sayı değil, büyük sayıları içeren çok sayıda karmaşık hesaplama olduğunu varsayıyorum.

Toplamı şimdi ve sonra almanız gerekiyorsa, bir model alanı oluşturmak ve kaydetmek için değer eklemek daha iyidir.

Eğer çoğunlukla güncellemeniz gerekiyorsa, normalde çağrıya değer almak (ikinci yöntem) daha uygun.

İlgili konular