Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中,如何通过编程检查IntegrityError是否与模型的特定唯一性约束相关?_Django_Django Models_Orm - Fatal编程技术网

在Django中,如何通过编程检查IntegrityError是否与模型的特定唯一性约束相关?

在Django中,如何通过编程检查IntegrityError是否与模型的特定唯一性约束相关?,django,django-models,orm,Django,Django Models,Orm,例如,如果我有此模型: #foo/models.py #Python标准库 从uuid导入uuid4 #德扬戈 从django.db导入模型 Foo类(models.Model): uuid_1=models.UUIDField(默认值=uuid4,唯一值=True) uuid_2=models.UUIDField(默认值=uuid4,唯一值=True) 然后我创建了它的实例: #Python标准库 从uuid导入uuid4 #德扬戈 从django.db导入IntegrityError #f

例如,如果我有此模型:

#foo/models.py
#Python标准库
从uuid导入uuid4
#德扬戈
从django.db导入模型
Foo类(models.Model):
uuid_1=models.UUIDField(默认值=uuid4,唯一值=True)
uuid_2=models.UUIDField(默认值=uuid4,唯一值=True)
然后我创建了它的实例:

#Python标准库
从uuid导入uuid4
#德扬戈
从django.db导入IntegrityError
#foo应用程序
从foo.models导入foo
const_uuid_1=uuid4()
const_uuid_2=uuid4()
第一个\u foo=foo.objects.create(uuid\u 1=const\u uuid\u 1,uuid\u 2=const\u uuid\u 2)
#违反“uuid_1”唯一性
尝试:
创建(uuid\u 1=const\u uuid\u 1)
除完整性错误外,如e:
通过
#违反“uuid_2”唯一性
尝试:
创建(uuid_2=const_uuid_2)
除完整性错误外,如e:
通过

那么,如何以编程的方式区分这两种违反唯一性的情况呢?在我的应用程序中,业务需求要求允许我的程序自动处理和纠正其中一个违规行为,但不允许自动处理和纠正另一个违规行为(必须向用户报告)。

您应该能够使用异常的
\uuuuuuuuuuuuuuuuuuu
属性来访问较低级别的异常。根据:

根据,设置了一个带有原始(基础)数据库异常的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性,允许访问提供的任何附加信息


如果您将postgresql与psycopg一起使用,您可以使用它获取更多调试信息。

这是一个很好的提示<代码>e.uuu原因uuu.diag
还有一个
约束u名称
属性。如果有一种方法可以可靠地关联
约束\u name
,我已经准备好了。我认为更好的方法是重写模型(或表单)中的clean方法并在那里执行验证。这样,您就可以轻松地检查导致错误的字段,然后直接将响应发送回用户,而不必等待数据库级别出现异常。(个人观点)@coderDude如果我不把整个事情用
@atomic
包起来并锁定表格,那它不会仍然容易受到种族条件的影响吗?否则,clean方法可能会验证OK,但当实际插入时间到时,表中可能会弹出一个新行,从而导致冲突,我将回到原点(必须知道违反了哪个约束)。是的,这确实是一个问题。我从来没有为这个问题的发生而在大规模的项目上工作过。我通常只是简单地在save和return中添加一个except IntegrityError,并带有“发生了一些错误。请重试”(在clean中执行验证后)。因此,如果该人再次尝试,他们就会找到原因