Skip to main content
 首页 » 编程设计

python之Django 1.11 order by field on related model duplicate results 解决方法

2024年08月19日33qq78292959

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

一个对话可以有很多评论。现在我想做的是对有最新评论的对话进行排序。我试图将其添加到对话模型中:

class Meta: 
  ordering = ['-comment__submitted_date'] 

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

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

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

有什么建议吗?

请您参考如下方法:

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

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