基于计算的过滤语句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,如果我们以后决定使用另一个数据库,查询将被翻译成其他数据库查询语言(当然这是可能的)。
如何在 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,如果我们以后决定使用另一个数据库,查询将被翻译成其他数据库查询语言(当然这是可能的)。