Поддержка
Django unique
и unique_together
обрабатывается на уровне базы данных, поэтому, будучи зависимой от базы данных, использование функции базы данных в ограничении не поддерживается в Django (не все базы данных могут ее поддерживать или поддерживать это последовательно и тд и тп). Однако у вас есть несколько вариантов:
Путь кода
Если важно поддерживать переносимость базы данных, переопределите метод save()
в своем классе модели и выполните проверку там в коде. Это, очевидно, снижение производительности, так как вам нужно будет выполнить запрос перед выпуском обновления / вставки, но, как и во всех случаях, связанных с производительностью, лучше сначала попробовать самое простое решение, а затем посмотреть, действительно ли существует проблема с производительностью для ваше приложение и среда развертывания. (Это фактически то, что делает проект "django-check-constraints", который Адам Бернье указал в комментариях к вопросу ... просто с уровнем абстракции, который вам, вероятно, не нужен).
Путь SQL
Или, если вас не очень заботит переносимость базы данных или вы хотите написать соответствующий SQL для всех баз данных, которые вам нужно поддерживать, вы можете воспользоваться ловушкой Django для запуска пользовательских операторов SQL после CREATE TABLE
запускается для модели. Документы django охватывают это здесь: Предоставление исходных данных SQL .
Хотя пример в документации, как следует из заголовка, предназначен для заполнения исходных данных с использованием SQL, вы можете поместить в файл любой набор операторов SQL, включая команды ALTER TABLE
, чтобы ввести управляемое DB ограничение с функцией сразу после создания таблицы. Django позволяет вам предоставлять отдельные операторы SQL для каждого поддерживаемого вами типа базы данных.