首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我比较日期时间,Django的str(queryset.query)返回无效的SQL

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

Stack Overflow用户
提问于 2019-08-20 23:42:33
回答 3查看 243关注 0票数 1

我有一个用queryset.filter(date__gte=datetime(2011,1,1))准备的Django查询集

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

代码语言:javascript
运行
复制
... WHERE "App_table"."date" >= 2011-1-1

但是,这是无效的SQL代码,因为如果我在Postgresql中运行此代码,则会收到以下错误:

代码语言:javascript
运行
复制
... 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代码以便我可以处理?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-21 00:10:11

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

代码语言:javascript
运行
复制
print(q.query. sql_with_params())

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

票数 2
EN

Stack Overflow用户

发布于 2021-11-02 09:07:40

除了Danel Roseman的回答,我是如何获得有效的SQL语句的,使用的是:

代码语言:javascript
运行
复制
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上测试

票数 0
EN

Stack Overflow用户

发布于 2019-08-20 23:57:30

如果我的模型字段是models.DateField,这就是我过滤日期的方法

代码语言:javascript
运行
复制
  queryset.filter(date__gte=datetime.date(2011,1,1))

我猜如果您已经将字段date声明为DateTimeField,那么比较就会起作用。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57577226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档