2015-12-06 134 views
0

我有一個抽象模型組,有2個孩子公司和債券(我簡化了我的例子)。由於我的模型WorkRelation,這些孩子與聯繫人連接。我想編寫一個函數get_number_of_contacts(),它返回通過對象WorkRelation與一個組連接的用戶數量。獲取記錄數

這非常困難,因爲我使用泛型外鍵。這種方法甚至可以實現這種方法嗎?

這是我的簡化models.py:

class Group(BaseModel):               
     name = models.CharField(max_length=30, unique=True)       
     *** a lot more attributes *** 

---> def get_number_of_contacts(self):           
      return 69                

     class Meta:                 
      abstract = True               


    class Company(Group):               
     def __str__(self):               
      return "Company " + self.name           

     class Meta:                 
      app_label = 'groups'              


    class Bond(Group):                
     def __str__(self):               
      return "Bond " + self.name            

     class Meta:                 
      app_label = 'groups' 

class WorkRelation(BaseModel):             
     contact = models.OneToOneField(Contact, on_delete=models.CASCADE, primary_key=Tru) 
     group_type = models.ForeignKey(ContentType)   
     group_id = models.PositiveIntegerField()          
     group = GenericForeignKey('group_type', 'group_id') 
     *** A lot more attributes *** 
+0

我不確定我完全理解你的問題,但你試圖獲得組中總人數,這對我來說聽起來像你可以做Group.objects.get(Group.user)。 count()'甚至是'Group.objects.all()。count()'? – qasimalbaqali

+0

是的,我正在嘗試獲取與羣組相關聯的人數。但問題是聯繫人通過一個對象WorkRelation進行連接。 – hY8vVpf3tyR57Xib

回答

0

好像你要計算什麼是真正WorkRelation對象的特定組,這是很容易的數量:

WorkRelation.objects.filter(group=my_group).count() 

既然你有聯繫的一比一的關係,你也可以算接觸,但會給你支付額外數據庫的成本完全相同的結果加入:

Contact.objects.filter(workrelation__group=my_group).count() 
+0

感謝您的幫助,我認爲這不起作用,因爲組是一個抽象對象。它返回以下內容:django.core.exceptions.FieldError:字段'組'不會生成自動反向關係,因此不能用於反向查詢。如果它是GenericForeignKey,請考慮添加GenericRelation。 – hY8vVpf3tyR57Xib

+0

因此,添加GenericRelation - 參見[的文檔(https://docs.djangoproject.com/en/1.9/ref/contrib/contenttypes/#reverse-generic-relations)。您可以將其添加到基類中,但如果不是,則只需將其添加到子類中,併爲每個子類使用不同的'related_query_name'。 –