Уникальное ограничение с игнорированием регистра

Как указать пользовательское ограничение для модели Django?

Как это

create table t
(
  login varchar(10),
  unique ( upper(login) )
);

person maxp    schedule 05.04.2009    source источник
comment
code.google.com/p/django-check-constraints   -  person mechanical_meat    schedule 05.04.2009


Ответы (1)


Поддержка Django unique и unique_together обрабатывается на уровне базы данных, поэтому, поскольку она сильно зависит от базы данных, использование функции базы данных в ограничении не поддерживается в Django (не все базы данных могут поддерживать ее или поддерживать ее последовательно и т. д. и т. д.). Однако у вас есть несколько вариантов:

Путь кода

Если важна переносимость базы данных, переопределите метод save() в классе модели и выполните проверку в коде. Это, очевидно, приводит к утечке производительности, так как вам придется выдавать запрос перед выпуском обновления/вставки, но, как и в случае со всеми вещами, связанными с производительностью, может быть лучше сначала попробовать самое простое решение, а затем посмотреть, действительно ли есть проблема с производительностью для вашего приложения и среды развертывания. (Это фактически то, что делает проект «django-check-constraints», на который Адам Бернье указал в комментариях к вопросу... просто с уровнем абстракции, который вам, вероятно, не нужен).

Путь SQL

Или, если вы не слишком заботитесь о переносимости базы данных или хотите написать соответствующий SQL для всех баз данных, которые вам нужно поддерживать, вы можете воспользоваться ловушкой Django для запуска пользовательских операторов SQL после того, как CREATE TABLE запускается для модель. Документация django описывает это здесь: Предоставление начального SQL Данные.

Хотя пример в документах, как следует из названия, предназначен для заполнения исходных данных с использованием SQL, вы можете поместить в файл любой набор операторов SQL, включая команды ALTER TABLE, чтобы ввести ограничение, управляемое БД, с функцией сразу после таблицы. созданный. Django позволяет вам предоставлять отдельные операторы SQL для каждого поддерживаемого типа базы данных.

person Jarret Hardie    schedule 05.04.2009
comment
sql/имя_модели.sql - это то, что я искал. - person maxp; 06.04.2009