Django查询过滤器,传递日期会导致无效的SQL语法

时间:2010-02-01 05:57:29

标签: python django

z = Pokes.objects.filter(
    pokestiming__when_start__lte=datetime.now(), 
    pokestiming__when_end__gte=datetime.now(),
    pokestiming__next_poke__lte=datetime.now(),
    poke_deleted=0,
    poke_operating=1,
)

这是我正在使用的查询。它选择任何Poke对象,并在日期范围内使用PokesTiming对象(外键)。它基本上是一个开始日期和到期日。

问题是,传递datetime.now(),即使它看起来与django文档中的语法完全相同,但SQL结果是:

  

SELECT [fieldnames] FROM pokes INNER JOIN pokes_timing ON(pokesid = pokes_timingpoke_id)WHERE({{ 1}}。pokes = 0 AND poke_deletedpokes_timing< = 2010-02-01 00:00:00 AND when_startpokes_timing< = 2010-02-01 13:50:48 AND next_pokepokes_timing> = 2010-02-01 13:50:48 AND when_endpokes = 1 )LIMIT 21

也就是说,传递的日期只是日期,不包含在字符串引号中,这会导致错误并且没有结果。该查询^由this method

检索

我确定我错过了一些愚蠢的事情

<小时/> 机型:

poke_operating

Bah - 一定是我。它似乎现在通过Django工作(测试数据我一定是错的 - 它现在返回一个结果)但原始SQL查询不起作用。我想Django在执行之前会做些什么吗?无论哪种方式,它似乎都在起作用。

3 个答案:

答案 0 :(得分:3)

此问题的错误报告已关闭为无效,因为Django没有现有方法可以将实际查询发送到数据库。

#17612 - SQLite, filter, datefield, datetime no quotes around date in sql query

您可以看到此时此官方文档中已提及此限制。

Databases - Parameters not quoted in connection.queries

答案 1 :(得分:1)

有一个解决方案(来自https://code.djangoproject.com/ticket/17741):

import datetime
from django.db import connection
from myapp.models import Entry
today_entry_list = Entry.objects.filter(post_date=datetime.date.today())
sql, params = today_entry_list.query.sql_with_params()
cursor = connection.cursor()
cursor.execute('EXPLAIN ' + sql, params)
print(cursor.db.ops.last_executed_query(cursor, sql, params)[8:])

答案 2 :(得分:0)

Django将始终将所有字段强制转换为正确的SQL语法,当您手动执行时,可能不会这样做。因此你的错误。