2016-01-04 2 views
0

У меня есть следующие модели: InvitationAccept - это приглашение с GFK.django aggregate over reverse общий внешний ключ

Я не хочу определять accepts GenericRelation, потому что я не хочу cascade delete, когда удаляю экземпляры InvitationAccept.

class InvitationAccept(models.Model): 

    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    invitation = generic.GenericForeignKey('content_type', 'object_id') 


class Invitation(models.Model): 

    accepts = generic.GenericRelation(InvitationAccept) 

https://docs.djangoproject.com/en/1.9/ref/contrib/contenttypes/

Заметим также, что при удалении объекта, который имеет GenericRelation, любые объекты, которые имеют GenericForeignKey указывая на это будет также удалены. В приведенном выше примере это означает, что если объект Bookmark был удален, любые объекты TaggedItem, указывающие на него, будут удалены одновременно .

Но тогда я хотел бы получить #accepts я мог бы использовать self.filter(user_invite=user).annotate(num_accepts=Count('accepts__id')).aggregate(Sum('num_accepts')), если бы я имел accepts поле.

Итак, как мне не быть accepts (а не каскадно-удалить) и запросить вышеуказанный агрегат?

ответ

0

Итак, вы хотите, чтобы подсчет принимал за приглашение для пользователя, не так ли? Возможно, вам следует просто использовать что-то вроде:

qs = (InvitationAccept.objects 
     .filter(invitation__user_invite=user) 
     .annotate(Count('invitation', distinct=True)) 
     .values('invitation', 'invitation__count')) 
Смежные вопросы