gpt4 book ai didi

python - 对 Django ORM 查询集应用任意排序

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:22 24 4
gpt4 key购买 nike

我有一个数据库表,其中包含代表每年重复发生的事件的项目集。记录集按月和日存储。我经常需要检索与一系列日历日期相对应的事件记录。我正在使用 Django ORM 来处理记录,所以目前我将日期转换为相应的 Q 对象(例如 Q(month=month, day=day)并在对 MyModel.objects.filter() 的调用中将它们组合在一起。

如果我的日期范围与新年相交,就会出现问题。如果我想要从 2013 年 12 月 31 日到 2014 年 1 月 1 日的事件,我会这样做:

MyModel.objects.filter(Q(month=12, day=31) | Q(month=1, day=1))

但我按顺序得到结果:

month = 1, day = 1
month = 12, day = 31

相反,我想按顺序获取结果:

month = 12, day = 31
month = 1, day = 1

出于不必要地使问题复杂化的原因,我不能简单地将查询分成两个查询,每年一个。我想进行一次查询并按所需顺序获得结果。如有必要,我可以重新制定查询。

我知道 extra 应该有用,但我不太明白如何使用它。

更新:

为了更接近预期的解决方案,为了强加绝对顺序,我可以以某种方式滑动 Julian Day作为“计算的”字段进入结果,并按该字段排序。但是该怎么做呢?

最佳答案

我有一个棘手的解决方案使用 extra 和 SQL CASE 语句:

start_month = 12
start_day = 31
end_month = 1
end_day = 1
query = (models.MyModel.objects.filter(Q(month=start_month, day=start_day) |
Q(month=end_month, day=end_day))
.extra(select={'order_me': '''CASE WHEN month*31+day < %s*31+%s
THEN (12+month)*31+day
ELSE (month)*31+day
END''' % (start_month, start_day)})
.extra(order_by=['order_me']))

一旦我添加了这个 order_me 字段(这不太好),我认为它应该用在谓词中而不是 Q(...)|Q(... ) 日期范围

query = (models.MyModel.objects.all()
.extra(select={'order_me': """CASE WHEN month*31+day < %s*31+%s
THEN (12+month)*31+day
ELSE (month)*31+day
END""" % (start_month, start_day) })
.extra(order_by=['order_me'])
.extra(where=['order_me < (12 + %s) * 31 + %s' % (end_month,
end_day)]))

关于python - 对 Django ORM 查询集应用任意排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19638334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com