Как реализовать обобщенное ограничение уникальности БД (A,B) и (B,A) в Django?

Я хочу проверить базу данных перед созданием объекта с полями one='a' и two='b', и не создавать (выбрасывать исключение), если в базе данных уже есть строки с полями one='b' и two='a' (в обратном порядке). То есть, гарантировать, что существует только одно из (один, два) и (два, один). Это похоже на обобщенное ограничение уникальности

Я использую Django 3.2.

Я вижу, что CheckConstraint поддерживает булевое Expression, а одним из типов выражения является агрегат. Поэтому я могу представить себе проверку того, что количество строк с (один, два) и (два, один) не более 1. Однако это звучит дорого, и я также не вижу примеров использования Count в CheckConstraint.

В качестве альтернативы я могу реализовать сигнал pre_save, который выдает запрос. Это кажется лучше, так как у меня будут данные для формирования запроса. Однако я не понимаю, как предотвратить сохранение с помощью сигнала pre_save. Есть ли у него возвращаемое значение, которое я могу использовать? Я не вижу этого в документации

Я открыт и для других идей.

Я не могу вспомнить ни одного ограничения на уровне базы данных, которое допускало бы такой тип ограничений.

Таким образом, ограничение может быть реализовано на уровне приложения. Вы создаете модель при отправке формы? В таком случае вы могли бы проверить наличие существующего ряда в базе данных в коде проверки формы.

Вернуться на верх