我正在尝试在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:

看: Mike-DB-Tools GitHub存储库

您会看到各个数据库的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)

当涉及我的代码时,我真的很糟糕,所以我鼓励您分叉并改进。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top