首页 > 解决方案 > 基于最大子属性的排序模型(具有潜在联系) - Django

问题描述

我想Docket根据最新的文档(子对象)对我的对象进行排序。通常有几个文档具有相同的date_filed. 根据教程,我尝试排序-documents__date_filed并且它有点工作。因为有多个文档具有完全相同的日期,所以我的 ListView 显示 2-3 重复行(每个日期关系一个)。如何避免获得重复的结果,并且输出中的每个 Docket 只保留一行?

class Docket(models.Model):
    name = models.CharField(max_length=200)
    class Meta:
        ordering = ['-documents__date_filed', Func(F('name'), function='LOWER')]

class Document(models.Model):
    docket = models.ForeignKey(Docket, on_delete=models.CASCADE, related_name="documents")
    date_filed = models.DateTimeField(default=timezone.now)

标签: pythondjango

解决方案


ListView如果它包含相关模型,则在其本身中进行排序可能会更好,因为现在几乎所有Docker.objects.all()查询集都会有重复。

您可以使用.distinct()[Django-doc]检索Docket对象的查询集,其中相同的对象只出现一次:

from django.views.generic import ListView
from django.db.models.functions import Lower

class DocketListView(ListView):
    model = Docket
    queryset = Docket.objects.order_by(
        '-documents__date_filed',
        Lower('name')
    ).distinct()

推荐阅读