基于计算django orm的过滤语句

时间:2018-05-28 11:02:44

标签: django django-orm

如何在django orm中翻译这样的查询?

select id, year, month 
where (year*100 + month) between 201703 and 201801

提前感谢您提供任何帮助

2 个答案:

答案 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")