2014-06-11 37 views
1

結果的模型字段我有這個模型Django的 - 它可以獲取模型方法

class Home(models.Model): 
    ... 
    number_female = models.IntegerField() 
    number_male = models.IntegerField() 
    def all_people(self): 
    return self.number_female + self.number_male 
    all_members = all_people(self) 

我收到:name 'self' is not defined

如何定義獲取模型方法結果的字段?這個Home的情景只是一個例子,我有更復雜的模型,我只是想讓問題更清晰。

+2

要保存在表中的字段?如果不將該方法作爲屬性。 – Rohan

+0

@Rohan,我真的不想保存字段,我這樣做是因爲我無法通過模型方法進行過濾。如果我使該方法屬性,那麼我可以通過這種方法過濾嗎? – doniyor

+0

爲什麼不做只是返回number_female + number_male? – juankysmith

回答

1

如果你想喜歡all_members添加計算字段作爲模型的一部分,那麼你將不得不重寫save功能:

class Home(models.Model): 
    ... 
    all_members = models.IntegerField() 

    def save(self): 
     all_members = self.all_people() 
     super(Home, self).save() 

現在,您可以通過all_members過濾。在這種情況下,最好使用@property修飾器all_members

另一種方法是使用Django的extra方法爲a different stackoverflow answer

+0

美麗,謝謝! – doniyor

+1

將'Person'添加到'Home'時,它不會更新'all_members'字段(除非通過信號明確告知),這對我來說並不像是非常健壯的設計。 – ptr

+0

@PeteTinkler但是如果我在新人進來後將房子重新保存,該怎麼辦? – doniyor

1

提到你還需要定義all_members爲模型場(不爲整數),然後填充它與所需的值,當你save()的實例。

class Home(models.Model): 
    ... 
    number_female = models.IntegerField() 
    number_male = models.IntegerField() 
    all_members = models.IntegerField() 


    def save(self): 
    self.all_members = self.number_female + self.number_male 
    super(Home, self).save() 
+0

謝謝老兄,聽起來不錯 – doniyor

0

我覺得Django Managers可以在這裏解決。例如:

定製經理:

class CustomFilter(models.Manager): 
     def all_people(self): 
      return self.number_female + self.number_male 

型號:

class Home(models.Model): 
    .... 
    objects= CustomFilter() 

瀏覽:

allpeople= Home.objects.all_people(Home.objects.all()) 
+0

-1是什麼原因? – ruddra

+0

''objects.all_people''只返回所有人的數量,對嗎?這對於每個家庭的對象,對吧? (我沒有dv,我uvoted) – doniyor

+0

'objects.all()'返回一個包含'Home'的所有對象的查詢集。 :) – ruddra