我有一个用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代码以便我可以处理?
发布于 2019-08-21 00:10:11
您可以使用query. sql_with_params()方法。
print(q.query. sql_with_params())这将打印查询的参数化版本。
发布于 2021-11-02 09:07:40
除了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上测试
发布于 2019-08-20 23:57:30
如果我的模型字段是models.DateField,这就是我过滤日期的方法
queryset.filter(date__gte=datetime.date(2011,1,1))我猜如果您已经将字段date声明为DateTimeField,那么比较就会起作用。
https://stackoverflow.com/questions/57577226
复制相似问题