2024-05-16 08:13:58 发布
网友
如何在下面的代码中特别捕捉一个唯一的约束失败404,我知道我必须在(这里?)剖面图
try: q = AnswerModel(user=user, yes_question=question_model) q.save() except ( here? ): return HttpResponseRedirect('/user/already_exists')
通常,“请求原谅”原则在编程中是一个很好的实践,但在这种特殊情况下,我不建议这样做。
您要查找的异常是IntegrityError。只需删除try-catch块并强制执行异常,您就可以轻松地了解这一点。回溯显示异常类。
IntegrityError
问题是,存在几种不同的完整性错误,因此在try-catch块中,必须检查类似if ex.pgcode == 23505的内容,以查看这是否是一个唯一的约束错误。这在这里之前已经得到了回答:IntegrityError: distinguish between unique constraint and not null violations
if ex.pgcode == 23505
更糟糕的是:每个ORM都有不同的错误代码,字段名不会是pgcode,但是其他一些ORM和一些ORM根本不会抛出唯一的约束。因此,如果您正在构建一个可重用的应用程序,或者如果您正在使用一个糟糕的ORM(如MySQL),或者如果您不确定将来是否会更改项目的数据库,您不应该这样做!
pgcode
更好的方法是简单地删除try catch块,并在保存之前检查对象是否已经在数据库中。
我不知道哪个字段在您的情况下是唯一的,所以我假设它是user字段。您的代码如下所示:
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很可能。
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
通常,“请求原谅”原则在编程中是一个很好的实践,但在这种特殊情况下,我不建议这样做。
您要查找的异常是
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
字段。您的代码如下所示:如果要处理组合的唯一约束,第一行是:
这就是你需要的。
为@mbrochh编辑:
是的,您可以更精确,但在有问题的情况下
UNIQUE failed
很可能。我建议通过get_或_create()来解决这个问题。
相关问题 更多 >
编程相关推荐