在Django中向WHERE子句添加自定义SQL,无需使用.raw()
我有一个复杂的 Django ORM 查询,我真的不想把它转换成原始 SQL,因为这个查询非常复杂,我想保持一致性,并且我使用了很多 ORM 的功能来生成这个查询,而且它已经经过了充分的测试。
我想在 WHERE 子句中添加一个过滤条件,针对一个日期时间字段。不过,我只想比较日期部分,而不考虑时间。
这是我现有查询的简化版本:
MyTable.objects.filter(date_field__gte=datetime.now().date())
但我把 date_field 转换成了 datetime_field,以便在某些情况下能更精确。不过在这个情况下,我仍然想进行仅日期的比较。像这样:
MyTable.objects.filter(datetime_field__datepartonly__gte=datetime.now().date())
在我选择的数据库 Postgres 中,这很简单:
SELECT * FROM mytable WHERE DATE(datetime_field) >= ...
我该如何在 Django 中做到这一点,而不把整个查询转换成原始 SQL 呢?
- 我尝试使用 F(),但只能指定字段名,不能写自定义 SQL。
- 我尝试使用 Q(),但情况也是一样。
- 我尝试使用 Django 的 SQL 函数(比如 Sum 等),但只有几个,而且看起来它们只适用于聚合查询。我还尝试使用别名,但 在 Django 或 SQL 中,WHERE 子句中不能使用别名
我该如何在 Django 中做到这一点,而不把整个查询转换成原始 SQL 呢?
1 个回答
2
datetime对象的year
、month
和day
字段是可以使用的,但经过测试后发现,似乎不支持在这些字段上使用__gte
这个功能。
这个是可以用的:
now = datetime.now()
results = MyTable.objects.filter(datetime_field__year=now.year, datetime_field__month=now.month, datetime_field__day=now.day)
但是不支持gte。
你可以选择从0:00开始创建一个datetime。
now = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
results = MyTable.objects.filter(datetime_field__gte=now)