Django .get() 在没有显式 '__exact' 查找的情况下引发了DoesNotExist 错误

标签 django orm

我遇到了问题,我既不能理解也不能“谷歌”,同时遵循“实用 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() 方法的奇怪行为。

我的 问题 是:
  • 在我的案例中,我是否误解了有关“__exact”含义的文档?
  • 如果不是,我的问题不是 Django/DB 错误吗?
  • 当查询结果不是查询集对象时,有没有办法检查 Django 执行的实际 SQL 查询?

  • 谢谢!

    备注 :我运行 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__exact=slug:

    选择 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/

    相关文章:

    language-agnostic - 切换到 ORM

    python - Django ManyToMany 关系的正向和反向查询

    python - 电子邮件集成

    Django-缓存测试

    database - GORM 中的复杂更新

    java - ORM 映射中的 "owning side"是什么?

    python - Django "remove hardcoded urls in templates"不工作

    python - Django 表单如何清理文本输入以防止 SQL 注入(inject)、XSS 等?

    ios - 通过外键 (API) 保存/检索数据

    python - 如何在 peewee(python)的单个事务中保存所有实例?