如何在django orm中翻译这样的查询?
select id, year, month
where (year*100 + month) between 201703 and 201801
提前感谢您提供任何帮助
答案 0 :(得分:3)
您可以先创建一个注释,然后对其进行过滤:
from django.db.models import F
(Modelname.objects
.annotate(yearmonth=F('year')*100+F('month'))
.filter(yearmonth__range=(201703, 201801)))
因此,我们在此处构建注释yearmonth
(如果您愿意,可以使用其他名称),并使其等于year
列时间100加month
列。接下来,我们可以对该注释进行过滤,并通过在此处指定具有两个边界的__range
来实现此目的。
通常这适用于执行此处执行的操作的任何数据库系统(将列乘以常数,将两个值相加),以及执行__range
过滤器(在MySQL中,这是翻译的)进入<var> BETWEEN <min> AND <max>
)。但是,由于我们使用Django ORM,如果我们后来决定使用另一个数据库,则查询将以其他数据库查询语言进行翻译(当然,这是可能的)。
答案 1 :(得分:2)
如何使用与此类似的东西。
您是否尝试过filter
和__range
Created_at
将成为您数据库中的字段
ModelName.objects.filter(created_at__range=(start_date, end_date))
稍后您可以在视图中进行计算,这只是一种解决方法。
如果你想运行完全相同的查询,那么你可以运行。
ModelName.objects.raw("select id, year, month
where (year*100 + month) between 201703 and 201801")