我遇到了一个问题,我不能理解也不会'谷歌',而是按照“实用Django项目”一书中的步骤进行操作。
下面的视图代码示例应返回特定的Entry对象(我省略了不必要的部分),但它引发了“DoesNotExist:条目匹配查询不存在”错误:
...
return render_to_response('weblog/entry_detail.html',
{'entry':Entry.objects.get(pub_date__year=pub_date.year,
pub_date__month=pub_date.month,
pub_date__day=pub_date.day,
slug=slug)
(我确认目标对象确实存在,等等)
当我用filter()方法替换.get()时,它用我的目标对象返回了queryset。
经过一些“打墙”会议后,我设法让替换后的.get()调用工作
slug=slug
与
slug__exact=slug
我无法区分这两者。在我看来,Django的文档明确指出,在这种情况下,“__exact”是隐含的(Django 1.6, "Making queries")
我也无法检查Django在.get()情况下运行的实际SQL查询,以与.filter()方法使用的SQL查询进行比较(结果是对象,而不是查询集或引发异常)。
所以,我实际上有2个变通方法(filter()[0]来获取单个对象,或者'__exact'),但我想用.get()方法理解奇怪的行为。
我的问题是:
谢谢!
注意:我运行Django 1.6.1 / Python 2.7.3 / MySQL 5.5.33
更新:我安装了建议的 django-debug-toolbar ,并且能够将.get()调用的查询与&没有'__exact'查找。我在这些查询之间看到的唯一区别是“AND”条件的顺序,所以仍然不知道发生了什么:
蛞蝓=蛞蝓:
选择weblog_entry
。id
,weblog_entry
。title
,weblog_entry
。excerpt
,weblog_entry
。{{1} },body
。weblog_entry
,pub_date
。weblog_entry
,excerpt_html
。weblog_entry
,body_html
。weblog_entry
, author_id
。weblog_entry
,slug
。weblog_entry
,status
。weblog_entry
,enable_comments
。weblog_entry
FROM {{ 1}} WHERE(提取(来自CONVERT_TZ的月份(featured
。weblog_entry
,'UTC','UTC'))= 2 AND weblog_entry
。pub_date
BETWEEN'2014- 01-01 00:00:00'和'2014-12-31 23:59:59'和提取(从CONVERT_TZ开始的日子(weblog_entry
。pub_date
,'UTC','UTC')) = 2 AND weblog_entry
。pub_date
='3rd-entry')
slug__exact =蛞蝓:
选择weblog_entry
。slug
,weblog_entry
。id
,weblog_entry
。title
,weblog_entry
。{{1} },excerpt
。weblog_entry
,body
。weblog_entry
,pub_date
。weblog_entry
,excerpt_html
。weblog_entry
, body_html
。weblog_entry
,author_id
。weblog_entry
,slug
。weblog_entry
,status
。weblog_entry
FROM {{ 1}} WHERE(提取(来自CONVERT_TZ的月份(enable_comments
。weblog_entry
,'UTC','UTC'))= 2 AND featured
。weblog_entry
BETWEEN'2014- 01-01 00:00:00'和'2014-12-31 23:59:59'和weblog_entry
。pub_date
='第三次进入'和提取(来自CONVERT_TZ的日子({{1} }。weblog_entry
,'UTC','UTC'))= 2)
注意:我试图从mysql控制台手动执行这些查询,他们都选择了目标条目;
Update2 :我已经更准确地将标题更改为指向问题。
答案 0 :(得分:1)
好的,让我代表集体无意识。
在我的案例中,我是否误解了有关'__exact'含义的文档?
不,你做对了。让我引用django doc:
为不方便提供查找类型(如 Entry.objects.get(id = 14))假定查找类型是精确的。
既然你发现了与要求相矛盾的事情,那么回答下一个问题就是:
如果不是,我的问题不是Django / DB错误吗?
是的,这是一个错误。如果您描述重现和file an issue
的步骤,我和整个Django社区将不胜感激有没有办法检查Django有哪些实际的SQL查询 执行时,查询结果不是查询集对象吗?
看起来你已经得到了答案:)