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

时间:2018-11-30 03:31:17

标签: django django-models orm

例如,如果我有这个模型:

# foo/models.py
# Python standard library
from uuid import uuid4

# Django
from django.db import models


class Foo(models.Model):
    uuid_1 = models.UUIDField(default=uuid4, unique=True)
    uuid_2 = models.UUIDField(default=uuid4, unique=True)

然后我创建它的实例:

# Python standard library
from uuid import uuid4

# Django
from django.db import IntegrityError

# foo app
from foo.models import Foo

const_uuid_1 = uuid4()
const_uuid_2 = uuid4()

first_foo = Foo.objects.create(uuid_1=const_uuid_1, uuid_2=const_uuid_2)

# violate `uuid_1` uniqueness
try:
    Foo.objects.create(uuid_1=const_uuid_1)
except IntegrityError as e:
    pass

# violate `uuid_2` uniqueness
try:
    Foo.objects.create(uuid_2=const_uuid_2)
except IntegrityError as e:
    pass

那么,如何通过编程将两个唯一性冲突区分开?在我的应用程序中,业务需求要求我的程序可以自动处理并纠正其中一种违规行为,而另一种则不能(必须将其报告给用户)。

1 个答案:

答案 0 :(得分:3)

您应该能够使用异常的__cause__属性来访问较低级别的异常。根据{{​​3}}:

  

根据Django documentation,为__cause__属性设置了原始(基础)数据库异常,从而允许访问提供的任何其他信息。

如果您将PostgreSQL与psycopg一起使用,则可以使用PEP 3134获取更多调试信息。