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

时间:2014-02-04 14:06:42

标签: django orm

我遇到了一个问题,我不能理解也不会'谷歌',而是按照“实用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()方法理解奇怪的行为。

我的问题是:

  1. 在我的案例中,我是否误解了有关'__exact'含义的文档?
  2. 如果不是,我的问题不是Django / DB错误吗?
  3. 当查询结果不是查询集对象时,有没有办法检查Django执行的实际SQL查询?
  4. 谢谢!

    注意:我运行Django 1.6.1 / Python 2.7.3 / MySQL 5.5.33

    更新:我安装了建议的 django-debug-toolbar ,并且能够将.get()调用的查询与&没有'__exact'查找。我在这些查询之间看到的唯一区别是“AND”条件的顺序,所以仍然不知道发生了什么:

    1. 蛞蝓=蛞蝓:

      选择weblog_entryidweblog_entrytitleweblog_entryexcerptweblog_entry。{{1} },bodyweblog_entrypub_dateweblog_entryexcerpt_htmlweblog_entrybody_htmlweblog_entryauthor_idweblog_entryslugweblog_entrystatusweblog_entryenable_commentsweblog_entry FROM {{ 1}} WHERE(提取(来自CONVERT_TZ的月份(featuredweblog_entry,'UTC','UTC'))= 2 AND weblog_entrypub_date BETWEEN'2014- 01-01 00:00:00'和'2014-12-31 23:59:59'和提取(从CONVERT_TZ开始的日子(weblog_entrypub_date,'UTC','UTC')) = 2 AND weblog_entrypub_date ='3rd-entry')

    2. slug__exact =蛞蝓:

      选择weblog_entryslugweblog_entryidweblog_entrytitleweblog_entry。{{1} },excerptweblog_entrybodyweblog_entrypub_dateweblog_entryexcerpt_htmlweblog_entrybody_htmlweblog_entryauthor_idweblog_entryslugweblog_entrystatusweblog_entry FROM {{ 1}} WHERE(提取(来自CONVERT_TZ的月份(enable_commentsweblog_entry,'UTC','UTC'))= 2 AND featuredweblog_entry BETWEEN'2014- 01-01 00:00:00'和'2014-12-31 23:59:59'和weblog_entrypub_date ='第三次进入'和提取(来自CONVERT_TZ的日子({{1} }。weblog_entry,'UTC','UTC'))= 2)

    3. 注意:我试图从mysql控制台手动执行这些查询,他们都选择了目标条目;

      Update2 :我已经更准确地将标题更改为指向问题。

1 个答案:

答案 0 :(得分:1)

好的,让我代表集体无意识。

  

在我的案例中,我是否误解了有关'__exact'含义的文档?

不,你做对了。让我引用django doc

  

为不方便提供查找类型(如   Entry.objects.get(id = 14))假定查找类型是精确的。

既然你发现了与要求相矛盾的事情,那么回答下一个问题就是:

  

如果不是,我的问题不是Django / DB错误吗?

是的,这是一个错误。如果您描述重现和file an issue

的步骤,我和整个Django社区将不胜感激
  

有没有办法检查Django有哪些实际的SQL查询   执行时,查询结果不是查询集对象吗?

看起来你已经得到了答案:)