django - 多对多字段上的 order_by 导致查询集中的重复条目

标签 django postgresql django-queryset django-orm django-postgresql

我正在尝试执行基于 m2m 字段的 order_by,但它最终会在我的查询集中创建重复的条目。我一直在搜索 django 文档和有关堆栈交换的相关问题,但我一直无法提出任何解决方案。

模型:

class WorkOrder(models.Model):
    ...
    appointment = models.ManyToManyField(Appointment, null=True, blank=True, related_name = 'appointment_from_schedule')
    ...

class Appointment(models.Model):

    title = models.CharField(max_length=1000, blank=True)
    allDay = models.BooleanField(default=False)
    start = models.DateTimeField()
    end = models.DateTimeField(null=True, blank=True)
    url = models.URLField(blank=True, null=True)

查询:

qs = WorkOrder.objects.filter(work_order_status="complete").order_by("-appointment__start")

结果:

[<WorkOrder: 45: Davis>, <WorkOrder: 45: Davis>]

在交互模式下:

>>>qs[0] == a[1]
True
>>>qs[0].pk
45
>>>qs[1].pk
45

如果我删除 order_by 那么我只会得到一个结果,但稍后添加它会将重复的条目放回原处。

>>>qs = WorkOrder.objects.filter(work_order_status="complete")
>>>qs
[<WorkOrder: 45: Davis>]
>>>qs.order_by('appointment__start')
[<WorkOrder: 45: Davis>, <WorkOrder: 45: Davis>]

我尝试添加 .distinct() 和 .distinct('pk'),但前者没有效果,后者导致错误:

ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

最佳答案

我采纳了 sfletche 提供的关于使用 annotate 的建议,并在 freenode.net irc channel #django 中讨论了这个问题。

用户 FunkyBob 和 jtiai 能够帮助我让它工作。

由于每个工作订单可以有多个约会,当我们要求它按约会排序时,它会为每个约会实例返回一行,因为它不知道我打算让它按哪个约会排序。

from django.db.models import Max

WorkOrder.objects.annotate(max_date=Max('appointment__start')).filter(work_order_status="complete").order_by('max_date')

所以,我们走在正确的道路上,只是为了让语法正确。

感谢 sfletche、FunkyBob 和 jtiai 的帮助。

关于django - 多对多字段上的 order_by 导致查询集中的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23600299/

相关文章:

c - C 错误 : is only a shell 中的 PostgreSQL 用户数据类型

python - 在 Django 中获取查询集中的对象计数

Django 检查查询集响应是否为空

django - 如何加入具有同一用户外键的多个模型的结果?

django - jQuery $.post 到 Django 返回 "500 Internal Server Error"

GAE 上 django nonrel 中的 Django 身份验证

postgresql - 为什么运行时间会受到物化 View 名称的影响?

postgresql升级备份和恢复相同端口

python - 在 View 中调用的函数中即时完​​成脚本

javascript - 如何从 Django/AJAX 中的表单创建动态表单集