2015-01-09 63 views
0

我有一個NewLink模型,它有3個不同的IntegerField屬性,一個用於downvotes,一個用於upvotes,最後一個用於上下兩個字段的總和。我知道如何在每次需要'linklikessum'元素時將我的視圖文件中的兩個字段求和,但我不知道如何輕鬆地將這些字段編碼到模型中。我顯然寧願將剛剛編碼的總和作爲linklikesum元素的屬性,所以我不必做類似Foo = NewLink.objects.get(pk=X)然後Foo.upvote + Foo.downvote有人可以幫助我,所以我不必每次都這樣做?在此先感謝Django:如何對models.py中的模型元素進行downvote和upvote元素,而不是在views.py中進行求和?

僅供參考,這裏是模型本身:

class NewLink(models.Model): 
    upvote = models.IntegerField(default=0) 
    downvote = models.IntegerField(default=0) 
    linklikessum = models.IntegerField(default=0) 
    url = models.URLField(null=True) 
      「」」. . .more stuff…「」」 

     def __unicode__(self): 
      return.self.url 

回答

3

除非這是總費用來計算,我也不會這樣存儲在數據庫中,只是使它模型的屬性。例如:

class NewLink(models.Model): 
    upvote = models.IntegerField(default=0) 
    downvote = models.IntegerField(default=0) 
    @property 
    def votetotal(self): 
     return self.upvote + self.downvote 

但如果昂貴的計算,你可以在模型的save做到這一點()方法,例如:

class NewLink(models.Model): 
    def save(self, *args, **kw): 
     self.votetotal = self.upvote + self.downvote 
     super(NewLink, self).save(*args, **kw) 
+0

你能詳細告訴我什麼時候可以使用模型的save()方法嗎?當你說昂貴時,如果在頁面上一次加載了許多NewLinks,那麼你的意思是CPU使用情況? – EazyC 2015-01-10 06:14:36

+1

昂貴可能意味着數學複雜。這也可能意味着您需要在多個模型中執行一堆連接。在所提供的示例中,將它作爲屬性執行並不昂貴,因爲您已經加載了該記錄,添加兩個字段的操作很簡單。一個相關的問題是觀看與儲蓄的相對頻率......在許多情況下,您查看的記錄多於保存的記錄,但這取決於您的預期用途。熟悉剖析工具和技術並讓這些成爲您需要優化的指南是個不錯的主意。 – dylrei 2015-01-10 17:26:21

+0

謝謝,這是有道理的。我讚賞解釋。因此,在我的模板中,我只能通過{{newlink_instance.votetotal}}來訪問示例中的「votetotal」字段,對吧?因爲那給了我一個錯誤。如何在調用對象的實例後訪問模板中的votetotal字段? – EazyC 2015-01-11 14:49:24

1

如果我理解正確的問題,你將需要創建所謂的方法。方法是模型中的一個函數。而不是做三個IntegerFields,只用兩個,做這樣的事情。

class NewLink(models.Model): 
    upvote = models.IntegerField(default=0) 
    downvote = models.IntegerField(default=0) 
    url = models.URLField(null=True) 
     「」」. . .more stuff…「」」 

    def __unicode__(self): 
     return self.url 

    def link_likes_sum(self): 
     return self.upvote + self.downvote 
相關問題