基于计算的过滤语句django orm

filter statement based on calculations django orm

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

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

在此先感谢您的帮助

使用类似的东西怎么样?

你有没有试过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")

您可以先创建注释,然后对其进行过滤:

<b>from django.db.models import F</b>

(Modelname.objects
          <b>.annotate(yearmonth=F('year')*100+F('month'))</b>
          .filter(<b>yearmonth__range=(201703, 201801)</b>))

所以这里我们构造一个注解yearmonth(你可以取别的名字),让它等于year列乘以100加上month列。接下来我们可以过滤该注释,并通过在此处指定具有两个边界的 __range 来实现。

通常这适用于执行您在此处执行的操作的任何数据库系统(将列与常数相乘,将两个值相加),以及 __range 过滤器(在 MySQL这个翻译成<var> BETWEEN <min> AND <max>)。然而,由于我们使用 Django ORM,如果我们以后决定使用另一个数据库,查询将被翻译成其他数据库查询语言(当然这是可能的)。