Django错误-不存在匹配的查询


98

我最终将项目发布到生产级别,突然之间,我遇到了一些在开发阶段从未解决的问题。

当用户发布一些操作时,有时会出现以下错误。

Traceback (most recent call last):

  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "home/ubuntu/server/opineer/comments/views.py", line 103, in comment_expand
    comment = Comment.objects.get(pk=comment_id)

  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 131, in get
    return self.get_query_set().get(*args, **kwargs)

  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 366, in get
    % self.model._meta.object_name)

DoesNotExist: Comment matching query does not exist

真正令我沮丧的是,该项目在本地环境中运行良好,此外,数据库中还存在匹配的查询对象DOES。

现在,我怀疑用户在保留给其他用户时正在访问数据库,但是无法证明我的观点,也没有任何解决方案。

有人以前有过这样的问题吗?有关如何解决此问题的任何建议?

非常感谢您的提前帮助。

编辑:我已使用从我收到的服务器错误电子邮件中检索到的相同信息手动查询数据库。我能够毫无问题地点击该条目。此外,似乎用户执行的完全相同的行为在大多数时间不会引发任何问题,而是在某些情况(尚不知道)中。总之,数据库中缺少条目绝对不是问题。


2
显然,这是一个数据问题:comment = Comment.objects.get(pk=comment_id)验证ID是否存在于数据库中
karthikr

3
“ python manage.py sqlall”将生成与您的模型相对应的SQL。检查它是否对应于数据库模式SQL。例如,如果使用PostgreSQL,它也可能是顺序问题。结论:您能否带来有关您的环境的更多信息(SQDB,DB,DB中的对应表以及models.py中的代码,...)?
Ricola3D 2013年

@ Ricola3D您好Ricola,我当前正在使用MySql DB从Amazon EC2实例托管它。我暂时正在使用内置的Django Comment。同时,我将尝试运行您建议的sqlall命令。谢谢。
克里斯·P

Answers:


105

您引发错误的行在这里:

comment = Comment.objects.get(pk=comment_id)

您尝试访问不存在的评论。

from django.shortcuts import get_object_or_404

comment = get_object_or_404(Comment, pk=comment_id)

您的用户将得到一个404信息,而不是在您的服务器上出错,这意味着他试图访问不存在的资源。

好的,到这里为止,我想您已经意识到这一点。

有些用户(并且我也是其中的一部分)让选项卡运行了很长时间,如果授权用户删除数据,则可能会发生这种情况。与发送电子邮件给管理员相比,404错误可能是处理删除的资源错误更好的错误。

其他用户从他们的历史记录中转到地址(与删除数据一样,因为可能会发生数据删除)。


3
在长期运行的标签页上+1。404通过旧标签在我身上经常发生。
Yuji'Tomita'Tomita 2013年

谢谢克里斯的建议。真正困扰我的是,当我手动查询MySql数据库时(使用从服务器收到的错误信息),我确实找到了正确的条目而没有任何问题。另外,同一操作有时会引发DidNotExist异常,但在其他大多数时间都可以使用。似乎数据库中缺少条目不存在问题:(
Chris P

我的用户可能较少,但是使用postgres时,我从来没有遇到过此类问题。我们确实没有很多信息,您的数据库没有从属/主群集?您不对查询集使用缓存吗?
christophe31

@ christophe31因此,我还没有真正实现任何一种数据库性能优化,也没有备份诸如从/主群集或在查询集上进行缓存的方法。我想我将实现这些功能,看看问题是否仍然存在。
克里斯·P

2
您也可以在catch from django.db import connection,,中添加此名称connection.connection.close()connection.connection = None以尝试重置数据库连接并从新的数据库开始。
christophe31

112

也许您没有使用这种主键的注释记录,那么您应该使用以下代码:

try:
    comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
    comment = None

3
在这种情况下的最佳选择。捕获错误并显示一个不错的预配置消息,而不是向用户抛出404。没有心脏灼伤。
user12379095'4

它在这里如何运作?def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or None不知道如何在此处实施尝试捕获
snh_nl

26

您可以使用此:

comment = Comment.objects.filter(pk=comment_id)

好吧,如果有想要的特定对象,则不能使用过滤器,因为如果查询不匹配,它可能会返回空列表。当它匹配时,您就必须使用列表中的第一个对象。
杰伊·莫迪

3
大概就是这样:使用过滤器并测试结果是否具有零个或一个条目,而不是生成异常?
Mike'Pomax'Kamermans

值得注意的是,这Model.objects.filter将返回查询集,而Model.objects.get将返回对象。如果对象不存在,则前者将返回一个空的查询集,后者将导致Model.DoesNotExist错误。
ron_g

Comment.objects.filter(pk=comment_id).first()None如果找不到记录,将返回。
steezeburger

15

您可以尝试这种方式。只是使用一个函数来获取你的对象

def get_object(self, id):
    try:
        return Comment.objects.get(pk=id)
    except Comment.DoesNotExist:
        return False
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.