【问题标题】:Django 1.11 order by field on related model duplicate results workaroundDjango 1.11 按字段排序相关模型重复结果解决方法
【发布时间】:2017-11-10 06:07:42
【问题描述】:

在 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']

一个对话可以有多个 cmets。现在我想做的是订购一个拥有最新 cmets 的对话。我试图将其添加到对话模型中:

class Meta:
  ordering = ['-comment__submitted_date']

这种方法有效,但它会在查询集中返回重复项——这种重复行为在 Django 中有很好的记录以及它发生的原因——https://docs.djangoproject.com/en/1.11/ref/models/querysets/#order-by——但它没有说明如何解决它。

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

可以在对话中添加一个“updated_at”或类似的字段,并在创建/更新评论时更新它,但这对我来说真的很老套和不干净,我宁愿避免如果可能的话。

有什么建议吗?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    我认为一种方法是找到每个对话的最后评论的日期,然后按此排序

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

    【讨论】:

    • 这个查询本身似乎有效!有什么办法可以将它放入“排序”元属性中,以便默认以这种方式排序?我不确定语法是什么。
    猜你喜欢
    • 2015-02-18
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多