Django错误 - 匹配查询不存在

Chr*_*s P 66 database django production django-models

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

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

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
Run Code Online (Sandbox Code Playgroud)

让我感到沮丧的是项目在本地环境中工作正常,而且数据库中存在匹配的查询对象.

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

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

非常感谢您的帮助.

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

Dra*_*tis 76

也许你没有使用这种主键的评论记录,那么你应该使用这个代码:

try:
    comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
    comment = None
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下的最佳选择。不要向用户抛出 404 错误,而是捕获错误并显示一条漂亮的预配置消息。心没有灼烧感。 (3认同)

chr*_*e31 61

您提出错误的行在这里:

comment = Comment.objects.get(pk=comment_id)
Run Code Online (Sandbox Code Playgroud)

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

from django.shortcuts import get_object_or_404

comment = get_object_or_404(Comment, pk=comment_id)
Run Code Online (Sandbox Code Playgroud)

您的用户将获得404,而不是在您的服务器上出现错误,这意味着他尝试访问非现有资源.

好的,我想你知道这一点.

一些用户(我是其中的一部分)让标签运行很长时间,如果用户被授权删除数据,可能会发生.与向管理员发送电子邮件相比,404错误可能是处理已删除资源错误的更好错误.

其他用户从他们的历史记录中转到地址(如果数据已被删除,则可能相同).

  • 长时间运行的标签上+1.通过旧标签404发生在我身上很多. (2认同)
  • 你也可以在catch中添加:`来自django.db import connection`,`connection.connection.close()`,`connection.connection = None`以尝试重置数据库连接并从新连接开始. (2认同)

小智 16

你可以用这个:

comment = Comment.objects.filter(pk=comment_id)
Run Code Online (Sandbox Code Playgroud)

  • 大概就是重点:使用过滤器并测试结果是零还是一个条目,而不是生成异常? (2认同)
  • 如果没有找到记录,`Comment.objects.filter(pk=comment_id).first()` 将返回 `None`。 (2认同)

Meh*_*san 7

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

def get_object(self, id):
    try:
        return Comment.objects.get(pk=id)
    except Comment.DoesNotExist:
        return False
Run Code Online (Sandbox Code Playgroud)