Del*_*Del 6 django postgresql django-orm django-queryset 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)
Run Code Online (Sandbox Code Playgroud)
询问:
qs = WorkOrder.objects.filter(work_order_status="complete").order_by("-appointment__start")
Run Code Online (Sandbox Code Playgroud)
结果:
[<WorkOrder: 45: Davis>, <WorkOrder: 45: Davis>]
Run Code Online (Sandbox Code Playgroud)
在交互模式下:
>>>qs[0] == a[1]
True
>>>qs[0].pk
45
>>>qs[1].pk
45
Run Code Online (Sandbox Code Playgroud)
如果我删除 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>]
Run Code Online (Sandbox Code Playgroud)
我曾尝试添加 .distinct() 和 .distinct('pk'),但前者没有效果,后者导致错误:
ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
Run Code Online (Sandbox Code Playgroud)
Del*_*Del 11
我采纳了 sfletche 提供的有关使用 annotate 的建议,并在 freenode.net irc 频道 #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')
Run Code Online (Sandbox Code Playgroud)
所以,我们走在正确的道路上,只是让语法正确。
感谢 sfletche、FunkyBob 和 jtiai 的帮助。
| 归档时间: |
|
| 查看次数: |
3105 次 |
| 最近记录: |