如何将相关对象的Max注释为Django查询集

时间:2015-11-14 20:21:08

标签: python django logic django-queryset

我有一个Django网站,用户可以在其中制作群组,然后在上述群组下撰写回复。

简单地说:

class Group(models.Model):
    owner = models.ForeignKey(User)        
    #some attributes

class Reply(models.Model):
    text = models.TextField(validators=[MaxLengthValidator(500)])
    writer = models.ForeignKey(User)

对于给定的用户,我想找到她所做的或曾经回复的所有群组(即使一次)。此外,在所有这些群组中,我想提取最近回复的ID - 无论是用户自己还是其他人做出的。

为了实现上述目标,我尝试过:

groups = Group.objects.filter(Q(owner=self.request.user)|Q(reply__writer=self.request.user)).distinct()
ids = groups.annotate(max_reply=Max('reply__id')).values_list('max_reply', flat=True)

这不起作用 - 在ids中,我只收到self.request.user本人写的最新回复,而不是每组下最近的绝对回复(由任何人编写)。我发现这很奇怪,因为看起来,这应该有效,不是吗?也许我错误地引用了反向外键。

你能帮我解决这个问题,还是建议一个替代方案?

1 个答案:

答案 0 :(得分:0)

以下是我目前正在完成的方式。我将所有相关组的ID分配给groups。我在每个下面找到了最大回复的ID,并将它们分配给replies。最后,我构建了一个大约60个这样的回复的查询集,并将其分配给replies_qs

groups = Group.objects.filter(Q(owner=self.request.user)|Q(reply__writer=self.request.user)).distinct().values_list('id', flat=True)
replies = Reply.objects.filter(which_group__in=groups).values('which_group_id').annotate(Max('id')).values_list('id__max', flat=True)
replies_qs = Reply.objects.filter(id__in=replies)[:60]

这是3次DB访问,如果有人有建议,我宁愿用更少的数据进行访问。