2015-12-06 4 views
0

У меня есть абстрактная модель группы, с 2 детьми Company и Bond (я упростил свой пример). Эти дети связаны с контактами благодаря моей модели 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: Поле 'group' не генерирует автоматическое обратное отношение и поэтому не может использоваться для обратного запроса. Если это GenericForeignKey, подумайте о добавлении GenericRelation. – hY8vVpf3tyR57Xib

+0

Итак, добавьте GenericRelation - см. [Docs] (https://docs.djangoproject.com/en/1.9/ref/contrib/contenttypes/#reverse-generic-relations). Вероятно, вы можете добавить его в базовый класс, но если нет, вам просто нужно добавить его в подклассы, используя для каждого из них 'related_query_name'. –

Смежные вопросы