В Django, как я могу программно проверить, связана ли ошибка IntegrityError с определенным ограничением уникальности модели? - PullRequest
0 голосов
/ 30 ноября 2018

Например, если у меня есть эта модель:

# 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 голосов
/ 30 ноября 2018

Вы должны иметь возможность использовать атрибут __cause__ исключения, чтобы получить доступ к исключению нижнего уровня.Согласно документации Django :

В соответствии с PEP 3134 атрибут __cause__ устанавливается с исходным (базовым) исключением базы данных, предоставляя доступ клюбая дополнительная предоставленная информация.

Если вы используете postgresql с psycopg, вы можете использовать e.__cause__.diag для получения дополнительной информации отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...