例如,如果我有这个模型:
# 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
那么,如何通过编程将两个唯一性冲突区分开?在我的应用程序中,业务需求要求我的程序可以自动处理并纠正其中一种违规行为,而另一种则不能(必须将其报告给用户)。
答案 0 :(得分:3)
您应该能够使用异常的__cause__
属性来访问较低级别的异常。根据{{3}}:
根据Django documentation,为
__cause__
属性设置了原始(基础)数据库异常,从而允许访问提供的任何其他信息。
如果您将PostgreSQL与psycopg一起使用,则可以使用PEP 3134获取更多调试信息。