Django';如果比较日期时间,则s str(queryset.query)返回无效的SQL
我有一个Django查询集,我准备使用Django';如果比较日期时间,则s str(queryset.query)返回无效的SQL,django,postgresql,django-orm,Django,Postgresql,Django Orm,我有一个Django查询集,我准备使用queryset.filter(date\uu gte=datetime(2011,1,1)) 如果我随后调用str(queryset.query)我会在字符串中看到: ... WHERE "App_table"."date" >= 2011-1-1 但是,这是无效的SQL代码,如果在Postgresql中运行此代码,则会出现以下错误: ... WHERE "App_table"."date" >= 2011-1-1 ERROR: opera
queryset.filter(date\uu gte=datetime(2011,1,1))
如果我随后调用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
,则比较会起作用。如果我的模型字段是models,我就是这样过滤日期的。DateField
:
queryset.filter(date__gte=datetime.date(2011,1,1))
我想如果您已将字段
date
声明为DateTimeField
,那么比较就可以了。您可以使用查询。sql_with_params()
方法
print(q.query. sql_with_params())
这将打印查询的参数化版本。您可以使用
查询。sql_with_params()
方法
print(q.query. sql_with_params())
这将打印查询的参数化版本。获取
str(queryset.query)
,并将其复制粘贴到数据库中。无论列是否存在,它都将不起作用。在表达式“WHERE”App_table中,“date”>=2011-1-1“Postgres将操作数2011-1-1插入为“整数”,在本例中计算为整数2009。因此,语句实际上变成了“date>=integer”,这是一个无效的比较。如果你想表达一个日期,你必须告诉Postgres这就是你想要的。在“App_table.”date“>=”2011-1-1'::date.Takestr(queryset.query)
,然后将其复制粘贴到数据库中。无论列是否存在,它都将不起作用。在表达式“WHERE”App_table中,“date”>=2011-1-1“Postgres将操作数2011-1-1插入为“整数”,在本例中计算为整数2009。因此,语句实际上变成了“date>=integer”,这是一个无效的比较。如果你想表达一个日期,你必须告诉Postgres这就是你想要的。在“App_table.”date“>=”2011-1-1'::date.这将返回一个元组,其中[0]
是查询,其中%s
代替参数,[1]是参数。如果我执行queryTuple[0]%queryTuple[1]
操作,它将提供与str(q.query)
相同的无效字符串。因此,我想我应该使用带参数的sql\u
,手动搜索[1]中的日期时间,并将其转换为带引号的字符串。Django没有办法做到这一点?这里有一个可能的答案来回答我的评论:是的,重点是这现在是db适配器而不是Django的责任。这将返回一个元组,其中[0]
是查询,其中%s
代替了参数,[1]是参数。如果我执行queryTuple[0]%queryTuple[1]
操作,它将提供与str(q.query)
相同的无效字符串。因此,我想我应该使用带参数的sql\u
,手动搜索[1]中的日期时间,并将其转换为带引号的字符串。Django没有办法做到这一点?这里有一个可能的答案来回答我的评论:是的,重点是这现在是db适配器的责任,而不是Django的责任。