代码之家  ›  专栏  ›  技术社区  ›  Kal

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

  •  1
  • Kal  · 技术社区  · 6 年前

    # 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 回复  |  直到 6 年前
        1
  •  3
  •   Kevin Christopher Henry    6 年前

    你应该能够使用 __cause__ 属性获取对较低级别异常的访问权限。根据 Django documentation :

    根据 PEP 3134 __原因__

    如果在psycopg中使用postgresql,则可以使用 e.__cause__.diag 有关更多调试信息。