Как реализовать обобщенное ограничение уникальности БД (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. Есть ли у него возвращаемое значение, которое я могу использовать? Я не вижу этого в документации
Я открыт и для других идей.
Я не могу вспомнить ни одного ограничения на уровне базы данных, которое допускало бы такой тип ограничений.
Таким образом, ограничение может быть реализовано на уровне приложения. Вы создаете модель при отправке формы? В таком случае вы могли бы проверить наличие существующего ряда в базе данных в коде проверки формы.