2012-04-17 185 views
1

如果我有2個相互關聯的模型:Django的自定義模型領域

class Person(models.Model) 
    name = models.CharField() 

class Project(models.Model): 
    person = models.ForeignKey(Person) 
    title = models.CharField() 

我經常發現自己試圖找到與每個人相關的項目的數量:

person = Person.objects.get(id=1) 
no_projects = Project.objects.filter(person=person).count() 

是否有添加的一種方式這作爲Person模型的自定義字段,這樣我可以只需撥打person.no_projects

回答

4

這可以通過將屬性添加到Person類來完成。

class Person(models.Model) 
    name = models.CharField() 

    @property 
    def no_projects(self): 
     return Project.objects.filter(person=self).count() 

但是現在可以這樣調用

person = Person.objects.get(id=1) 
person.no_projects 
1

您可以使用屬性()來產生動力場。

class Project(models.Model): 
    person = models.ForeignKey(Person) 
    title = models.CharField() 

    def _get_no_projects(self): 
     return Projects.objects.filter(person=self).count() 

    no_projects = property(_get_no_projects) 

但動力場不能在查詢中使用,因爲他們並不真正將數據存儲到數據庫中。

FYI:http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/

4

事實上,該功能是(幾乎)內置。除了查詢項目外,您還可以執行person.project_set.count()以獲取該人員的項目數(並且.all()可以獲取實際列表)。

+0

謝謝,不知道這個。這將如何比較效率與標記的答案,還是它們都調用單個count()查詢? – meepmeep 2012-04-17 12:39:55

+0

他們評估到相同的SQL。 – 2012-04-17 12:56:08