题
我正在尝试在django中执行以下SQL的等同:
从申请人中选择 * date_out -date_in> = 1和date_out -date_in <= 6
我可以作为RAW SQL查询来做到这一点,但这在处理Rawqueryset而不是常规的QuerySet对象时变得令人沮丧,因为我希望以后在代码中过滤它。
解决方案
您可以使用 extra()
方法并传递 where
关键字参数。的价值 where
应该是包含SQL的列表 WHERE
上面查询的条款。我用PostgreSQL 8.4对此进行了测试,在我的情况下,这就是外观:
q = Applicant.objects.extra(where = ["""date_part('day', age(date_out, date_in)) >= 1 and
date_part('day', age(date_out, date_in)) <= 6"""])
这将使您有效 QuerySet
实例。
其他提示
我遇到了Django的问题,而不是本地支持 Datediff
(以及其他数据库当量),并且需要多次使用此类功能来为特定项目使用。
在进一步阅读后,很明显,在主要数据库口味之间,计算两个日期间隔的实施在两个日期之间存在很大不同。这可能就是为什么它在Django中还没有本地抽象功能的原因。所以我为自己写了自己的django orm函数 datediff
:
您会看到各个数据库的Docstrings中编写的数据库后端之间的语法不同。日期支持SQLITE,MySQL / Mariadb,Postgresql和Oracle。
用法(Django 1.8+):
from db_tools import Datediff
# Define a new dynamic fields to contain the calculated date difference
applicants = Applicant.objects.annotate(
days_range=Datediff('date_out','date_in', interval='days'),
)
# Now you can use this dynamic field in your standard filter query
applicants = applicants.filter(days_range__gte=1, days_range__lte=6)
当涉及我的代码时,我真的很糟糕,所以我鼓励您分叉并改进。
不隶属于 StackOverflow