如何在djang中捕获“UNIQUE constraint failed”404

2024-05-16 08:13:58 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在下面的代码中特别捕捉一个唯一的约束失败404,我知道我必须在(这里?)剖面图

try:
    q = AnswerModel(user=user, yes_question=question_model)
    q.save()
except ( here? ):
    return HttpResponseRedirect('/user/already_exists')

Tags: 代码modelreturnheresaveexistsyesquestion
3条回答

通常,“请求原谅”原则在编程中是一个很好的实践,但在这种特殊情况下,我不建议这样做。

您要查找的异常是IntegrityError。只需删除try-catch块并强制执行异常,您就可以轻松地了解这一点。回溯显示异常类。

问题是,存在几种不同的完整性错误,因此在try-catch块中,必须检查类似if ex.pgcode == 23505的内容,以查看这是否是一个唯一的约束错误。这在这里之前已经得到了回答:IntegrityError: distinguish between unique constraint and not null violations

更糟糕的是:每个ORM都有不同的错误代码,字段名不会是pgcode,但是其他一些ORM和一些ORM根本不会抛出唯一的约束。因此,如果您正在构建一个可重用的应用程序,或者如果您正在使用一个糟糕的ORM(如MySQL),或者如果您不确定将来是否会更改项目的数据库,您不应该这样做!

更好的方法是简单地删除try catch块,并在保存之前检查对象是否已经在数据库中。

我不知道哪个字段在您的情况下是唯一的,所以我假设它是user字段。您的代码如下所示:

answers = AnswerModel.objects.filter(user=user)
if answers:
   return HttpResponseRedirect('/user/already_exists')
obj = AnswerModel.objects.create(user=user, yes_question=question_model)
...

如果要处理组合的唯一约束,第一行是:

answers = AnswerModel.objects.filter(user=user, yes_question=question_model)
from django.db import IntegrityError

except IntegrityError:

这就是你需要的。

为@mbrochh编辑

from django.db import IntegrityError

except IntegrityError as e: 
    if 'unique constraint' in e.message: # or e.args[0] from Django 1.10
        #do something

是的,您可以更精确,但在有问题的情况下UNIQUE failed很可能。

我建议通过get_或_create()来解决这个问题。

new_obj, created = AnswerModel.objects.get_or_create(user=user, yes_question=question_model)
if created:
    do_something_for_new_object(new_obj)
else:
    logging.error("Duplicated item.")
    return

相关问题 更多 >