ChatGPT解决这个技术问题 Extra ChatGPT

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

真正让我感到沮丧的是,该项目在本地环境中运行良好,此外,匹配的查询对象确实存在于数据库中。

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

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

非常感谢您提前提供的帮助。

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

很明显,这是一个数据问题:comment = Comment.objects.get(pk=comment_id) 验证 id 是否存在于数据库中
“python manage.py sqlall”将生成与您的模型对应的 SQL。检查它是否对应于数据库模式 SQL。例如,如果使用 PostgreSQL,它也可能是一个顺序问题。总之:您能否提供有关您的环境的更多信息(SQDB、DB、DB 中的对应表和 models.py 中的代码,...)?
@Ricola3D 你好 Ricola,我目前正在使用从 Amazon EC2 实例托管它的 MySql DB。我暂时使用的是内置的 Django Comment。同时,我将尝试运行您建议的 sqlall 命令。谢谢你。

D
DJGrandpaJ

也许您没有具有此类主键的 Comments 记录,那么您应该使用以下代码:

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

这种情况下的最佳选择。不要向用户抛出 404,而是捕获错误并显示一个漂亮的预配置消息。心不烧。
它将如何在这里工作? def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or None 不知道如何在这里实现 try catch
很好的答案。我有一个用例,其中有按零件编号的上一条和下一条记录的导航按钮。但是,有时会跳过零件编号。捕获此错误并返回 None 是完美的。
c
christophe31

您提出错误的行在这里:

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 错误可能比向管理员发送电子邮件更好。

其他用户会从他们的历史记录中访问地址(如果数据已被删除,则相同,因为它可能会发生)。


在长时间运行的标签上 +1。通过旧标签的 404 经常发生在我身上。
谢谢克里斯的建议。真正困扰我的是,当我手动查询 MySql 数据库时(使用从服务器收到的错误信息),我确实点击了正确的条目而没有任何问题。此外,相同的操作有时会引发 DoesNotExist 异常,但其他大部分时间都有效。数据库中缺少条目似乎不是问题:(
我的用户可能较少,但使用 postgres 我从来没有遇到过这种问题。我们真的没有太多信息,你的数据库没有slave/master集群?您不在查询集上使用缓存吗?
@christophe31 所以我还没有真正实现任何类型的数据库性能优化,也没有备份方法,例如从属/主集群或在查询集上缓存。我想我会实现这些功能,看看问题是否仍然存在。
您也可以在 catch 中添加:from django.db import connectionconnection.connection.close()connection.connection = None 以尝试重置数据库连接并从新连接开始。
K
Klang Wutcharin

你可以使用这个:

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

好吧,如果有您想要的特定对象,那么您不能使用过滤器,因为如果查询不匹配,它可能会返回空列表。当它匹配时,你必须使用列表中的第一个对象。
大概这就是重点:使用过滤器并测试结果是否有零个或一个条目,而不是生成异常?
值得注意的是,Model.objects.filter 将返回一个查询集,而 Model.objects.get 将返回一个对象。如果对象不存在,前者将返回一个空查询集,后者将导致 Model.DoesNotExist 错误。
如果没有找到记录,Comment.objects.filter(pk=comment_id).first() 将返回 None
M
Md Mehedi Hasan

你可以试试这个方法。只需使用一个函数来获取您的对象

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

A
Akash Darji

试试这个

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

提问者不需要创建评论
的确。如果您正在根据条件查询记录,并且假设添加记录可能根本不合适,则不满足该条件。前两个答案很好地涵盖了这个问题。
w
westsidesamson

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

最简单的做法是在生产数据库中找到这些依赖项并提供它们


在某些情况下,可能直到为时已晚才知道依赖关系。我给你举个例子。我正在构建一个数字图书馆,其中详细视图显示上一个和下一个记录导航按钮(以便于阅读)。 99% 的情况下,用户应该输入上一个和下一个部件号,但有时他们不能。因此,必须有一种方法来防止错误。就我而言,try/except 逻辑是理想的。前两个答案很好地涵盖了这个问题。
我完全同意,最佳实践是始终为此类错误做好准备,而“尝试并排除”是做到这一点的好方法。我的评论只是处理错误的原因

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅