【问题标题】:How to annotate the Max of a related object to a Django queryset如何将相关对象的 Max 注释到 Django 查询集
【发布时间】:2023-03-19 05:38:01
【问题描述】:

我有一个 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 自己写的最新回复,而不是每个组下的绝对最新回复(任何人写的)。我觉得这很奇怪,因为看起来,这应该可行,不是吗?也许我错误地引用了反向外键。

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

【问题讨论】:

    标签: python django logic django-queryset


    【解决方案1】:

    以下是我目前的完成方式。我将所有相关组的 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 次数据库访问,如果有人有建议,希望少做。

    【讨论】:

      猜你喜欢
      • 2013-12-07
      • 1970-01-01
      • 2020-04-29
      • 2021-10-17
      • 2016-07-11
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多