我遇到了问题,我既不能理解也不能“谷歌”,同时遵循“实用 Django 项目”一书中的步骤。
下面的 View 代码示例应该返回特定的 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() 时,它返回了我的目标对象的查询集。
经过一些“撞墙” session 后,我设法使 .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 调试工具栏 并且能够将 .get() 调用的查询与 & w/o '__exact' 查找进行比较。我在这些查询之间看到的唯一区别是“AND”条件的顺序,所以仍然不知道发生了什么:
选择
weblog_entry
. id
, weblog_entry
. title
, weblog_entry
. 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
. enable_comments
, weblog_entry
. featured
发件人 weblog_entry
WHERE (EXTRACT(MONTH FROM CONVERT_TZ( weblog_entry
. pub_date
, 'UTC', 'UTC')) = 2 AND weblog_entry
. pub_date
BETWEEN '2014-001: 2014-12-31 23:59:59' AND EXTRACT(DAY FROM CONVERT_TZ( weblog_entry
. pub_date
, 'UTC', 'UTC')) = 2 AND weblog_entry
. |114-rd3567 ' ) 选择
slug
. weblog_entry
, id
. weblog_entry
, title
. weblog_entry
, 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
, enable_comments
. weblog_entry
发件人 featured
WHERE (EXTRACT(MONTH FROM CONVERT_TZ( weblog_entry
. weblog_entry
, 'UTC', 'UTC')) = 2 AND pub_date
. weblog_entry
BETWEEN '2014-001: 2014-12-31 23:59:59' AND pub_date
. weblog_entry
= '3rd-entry' AND EXTRACT(DAY FROM CONVERT_TZ( slug
. weblog_entry
), 'UTC'), 'UTC' 2) 备注 :我尝试从 mysql 控制台手动执行这些查询,并且它们都选择了目标条目;
更新 2 : 我已更改标题以更准确地指出问题。
最佳答案
好的,让我谈谈集体无意识。
Did I misunderstand documentation about '__exact' implication in my case?
不,你没看错。让我引述 django doc :
As a convenience when no lookup type is provided (like in Entry.objects.get(id=14)) the lookup type is assumed to be exact.
并且由于您观察到与要求相矛盾的内容,因此下一个问题的答案是:
If no, isn't my problem a Django/DB bug?
是的,这是一个错误。如果您描述重现的步骤和 file an issue,我和整个 Django 社区将不胜感激
Is there a way to check the actual SQL query which Django has performed, when result of query is not a queryset object?
看起来你已经得到了答案:)
关于Django .get() 在没有显式 '__exact' 查找的情况下引发了DoesNotExist 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21554703/