如果我比较日期时间,Django 的 str(queryset.query) returns 无效 SQL

Django's str(queryset.query) returns invalid SQL if I compare datetimes

我有一个用 queryset.filter(date__gte=datetime(2011,1,1))

准备的 Django 查询集

如果我随后调用 str(queryset.query) 我会在字符串中看到:

... WHERE "App_table"."date" >= 2011-1-1

但是,这是无效的 SQL 代码,就好像我 运行 在 Postgresql 中我得到这个错误:

... WHERE "App_table"."date" >= 2011-1-1
ERROR:  operator does not exist: date >= integer
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

为什么会这样,我如何让 Django 输出我可以处理的正确 SQL 代码?

如果我的模型字段是 models.DateField:

,这就是我过滤日期的方式
  queryset.filter(date__gte=datetime.date(2011,1,1))

我想如果您已将字段 date 声明为 DateTimeField,则比较会起作用。

您可以使用query. sql_with_params()方法。

print(q.query. sql_with_params())

这将打印查询的参数化版本。

添加到 Danel Roseman 的回答中,我如何获得有效的 SQL 语句是使用这个:

sql, params = unioned_qs.query.sql_with_params()

params_with_quotes = []
for x in params:
   params_with_quotes.append("'%s'" % x)
print(sql % tuple(params_with_quotes))

Django SQL 查询无效的原因是缺少引号,通过用带引号的字符串替换所有值,SQL 应该是有效的。适用于我的一个边缘案例,但尚未对这一理论进行足够广泛的测试。

在 Django 3.2 和 Python 3.9

上测试