except IntegrityError as e:
if 'unique constraint' in str(e.args).lower():
示例:
from django.db import IntegrityError
for column in csv.reader(io_string, delimiter=',', quotechar="|"):
try:
_, created = Brand.objects.update_or_create(
system_id=column[0],
name=column[1],
slug=column[2],
description=column[3],
image=column[4]
)
except IntegrityError as e:
if 'unique constraint' in str(e.args).lower():
continue
else:
raise e # Not the unique error we were expecting
from django.db import IntegrityError
try:
if form.is_valid():
form.save()
except IntegrityError as e:
if 'UNIQUE constraint' in str(e.args):
#your code here
6条答案
按热度按时间vhmi4jdf1#
这就是你需要的
编辑为@mbrochh:
是的,你可以更精确,但在问题的情况下,
UNIQUE failed
的可能性很高。cotxawn72#
恕我直言,我建议通过get_or_create()来解决这种情况。
ilmyapht3#
通常,“请求原谅”原则是编程中的一个很好的实践,但在这种特殊情况下,我不推荐它。
您正在查找的异常是
IntegrityError
。您可以通过简单地删除try-catch块并强制该异常来轻松地解决这个问题。回溯显示异常类。问题是,有几种不同类型的完整性错误,因此在try-catch块中,您必须检查类似
if ex.pgcode == 23505
的内容,以查看这是否实际上是一个UNIQUE约束错误。这个问题之前已经回答过了:IntegrityError: distinguish between unique constraint and not null violations更糟的是:每个ORM都有不同的错误代码,字段名不会是
pgcode
,而是其他的,有些ORM根本不会抛出UNIQUE约束。因此,如果你正在构建一个可重用的应用程序,或者如果你正在使用一个糟糕的ORM(如MySQL),或者如果你不确定将来是否会更改项目的数据库,你不应该这样做!更好的方法是简单地删除try-catch块,并在保存之前检查对象是否已经在数据库中。
我不知道在您的例子中哪个字段是UNIQUE,所以我将假设它是
user
字段。你的代码看起来像这样:如果你正在处理一个组合的唯一约束,第一行应该是这样的:
1cklez4t4#
Python 3.5以上版本
您需要:
示例:
oknrviil5#
在
django.db.models.query.QuerySet._create_object_from_params
中找到。还有一些变化:js81xvg66#
唯一约束失败返回:“('UNIQUE约束失败:notepad_notepadform. title')”基本上是一个元组,所以我们可以使用下面的代码来捕获它并执行任何需要的操作: