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 JOINpokes_timing
ON(pokes
。id
=pokes_timing
。poke_id
)WHERE({{ 1}}。pokes
= 0 ANDpoke_deleted
。pokes_timing
< = 2010-02-01 00:00:00 ANDwhen_start
。pokes_timing
< = 2010-02-01 13:50:48 ANDnext_poke
。pokes_timing
> = 2010-02-01 13:50:48 ANDwhen_end
。pokes
= 1 )LIMIT 21
也就是说,传递的日期只是日期,不包含在字符串引号中,这会导致错误并且没有结果。该查询^由this method
检索我确定我错过了一些愚蠢的事情
<小时/> 机型:
poke_operating
Bah - 一定是我。它似乎现在通过Django工作(测试数据我一定是错的 - 它现在返回一个结果)但原始SQL查询不起作用。我想Django在执行之前会做些什么吗?无论哪种方式,它似乎都在起作用。
答案 0 :(得分:3)
此问题的错误报告已关闭为无效,因为Django没有现有方法可以将实际查询发送到数据库。
#17612 - SQLite, filter, datefield, datetime no quotes around date in sql query
您可以看到此时此官方文档中已提及此限制。
答案 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语法,当您手动执行时,可能不会这样做。因此你的错误。