django聚合反向通用外键

时间:2016-01-04 06:36:25

标签: django django-queryset

我有以下模型,InvitationAccept引用GFK邀请。

我不想定义accepts GenericRelation,因为当我删除I​​nvitationAccept实例时,我不想要cascade delete

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的对象都是   也被删除了。在上面的示例中,这意味着如果是书签   对象被删除,指向它的任何TaggedItem对象都是   同时删除。

但是我想得到#accepts 如果我有self.filter(user_invite=user).annotate(num_accepts=Count('accepts__id')).aggregate(Sum('num_accepts'))字段,我可以使用accepts

那我怎么没有accepts(不是级联删除)并查询上面的聚合?

1 个答案:

答案 0 :(得分:0)

所以你想要为用户的每个邀请计算一次,对吧?也许你应该使用类似的东西:

qs = (InvitationAccept.objects
      .filter(invitation__user_invite=user)
      .annotate(Count('invitation', distinct=True))
      .values('invitation', 'invitation__count'))