不存在 Django 错误匹配查询

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

当用户发布一些操作时,我有时会得到以下错误。

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 存在于数据库中。

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

以前有人遇到过这样的问题吗? 对于如何解决这个问题有什么建议吗?

非常感谢你的提前帮助。

编辑: 我使用从我收到的服务器错误电子邮件中检索到的相同信息手动查询数据库。我可以毫无障碍地击中入口。此外,似乎用户执行的完全相同的行为在大多数情况下不会引起任何问题,而是在某些情况下(这还是未知的)。总之,这绝对不是数据库中缺少条目的问题。

279472 次浏览

你的线条提出了错误,在这里:

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错误可能是处理已删除资源错误的更好错误。

其他用户通过他们的历史记录访问地址(如果数据可能已经被删除,也是如此)。

你可以用这个:

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

也许你没有这样的主键注释记录,那么你应该使用这个代码:

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

你可以试试这种方法。只需使用一个函数来得到你的对象

def get_object(self, id):
try:
return Comment.objects.get(pk=id)
except Comment.DoesNotExist:
return False

试试这个

comment, created = Comment.objects.get_or_create(pk=comment_id)

我认为问题在于,有一些数据已经在您的开发服务器中传递,但是不会迁移到您的生产服务器上。

最简单的方法是在生产数据库上定位这些依赖项并提供它们

comment = Comment.objects.get(pk=comment_id) if Comment.objects.filter(pk=comment_id).exists() else None

与您的问题无关,但作为附加,为了不得到这个错误,您可以增加单元测试的数量,并停靠您的应用程序。