Как поймать IntegrityError при использовании функции ManyToMany add() с неверными идентификаторами?
У меня есть две модели (просто для примера):
class One(BaseModel):
name = models.CharField()
twos = models.ManyToManyField(Two)
class Two(BaseModel):
title = models.CharField()
Когда я пытаюсь добавить список ids модели Two к модели One с помощью one.twos.add(*[id1, id2]), он работает, пока я не передам неверный id, когда это не удается
psycopg2.errors.ForeignKeyViolation: insert or update on table "one_twos" violates foreign key constraint "one_two_id_572a5216_fk_twos"
DETAIL: Key (two_id)=(e2871924-5bb4-492e-b7c3-4c5ca3cc7f5e) is not present in table "twos_two".
django.db.utils.IntegrityError: insert or update on table "one_twos" violates foreign key constraint "one_two_id_572a5216_fk_twos"
DETAIL: Key (two_id)=(e2871924-5bb4-492e-b7c3-4c5ca3cc7f5e) is not present in table "twos_two".
Похоже, что это не состояние гонки (упомянутое здесь Django: IntegrityError during Many To Many add()).
Мне нужно сообщить фронтенду, что такое-то id недействительно, но я не могу поймать эти два IntergityErrors, чтобы повторно вызвать мое пользовательское исключение с сообщением и id.
Буду очень признателен за любую помощь в этом вопросе.
Возможно, это не лучший вариант, но вы можете попробовать следующее: Создать набор всех идентификаторов в Two:
two_ids_set = set(Two.objects.all().values_list("id", flat=True))
тогда вы можете проверить пересечение или различие между множествами. Например:
V Difference вернет все недопустимые идентификаторы (идентификаторы, которых нет в таблице Two)
set([id1, id2]).difference(two_ids_set)
V Пересечение вернет все действительные идентификаторы (идентификаторы, которые присутствуют в таблице Two)
set([id1, id2]).intersection(two_ids_set)