Django 1.11按相关模型的字段顺序重复结果解决方法

时间:2017-11-09 21:56:45

标签: python django django-models

在Django 1.11中,我有一个父和子模型(一对多关系)简化如下:

class Conversation(models.Model):
  name = models.CharField(max_length=150)

class Comment(models.Model):
  comment_text = models.TextField()
  submitted_date = models.DateTimeField()
  conversation = models.ForeignKey(Conversation, on_delete=models.CASCADE)

  class Meta:
    ordering = ['-submitted_date']

对话可以有很多评论。现在我想要做的是订购对话,其中一个人有最新的评论。我试图将其添加到Conversation模型中:

class Meta:
  ordering = ['-comment__submitted_date']

这类工作,但它在queryset中返回重复 - 这个重复行为在Django中有详细记录,为什么会发生 - https://docs.djangoproject.com/en/1.11/ref/models/querysets/#order-by - 但它没有说明如何解决它。

我正在寻找解决此限制的方法。总体目标是:按最近的评论(submitted_date)排序对话。我尝试了多种变体,但它要么根本不排序,要么返回重复(这对我没用)。 distinct()也不起作用,链接中也记录了这一点。

可以在Conversation中添加'updated_at'或类似的字段,并在创建/更新评论时更新,但这对我来说感觉真的很乱,而且我宁愿避免如果可能的话。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我认为一种方法是找到每个会话的最后一条评论的日期,然后按该

排序
Conversation.objects.annotate(last_comment=Max('comment__submitted_date')) \
                    .order_by("last_comment")