У меня есть модель Foo, которая имеет панель полей. Поле bar должно быть уникальным, но допускать нули в нем, то есть я хочу разрешить более одной записи, если поле bar null
, но если это не null
, значения должны быть уникальными.
Вот моя модель:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
И вот соответствующий SQL для таблицы:
CREATE TABLE appl_foo
(
id serial NOT NULL,
"name" character varying(40) NOT NULL,
bar character varying(40),
CONSTRAINT appl_foo_pkey PRIMARY KEY (id),
CONSTRAINT appl_foo_bar_key UNIQUE (bar)
)
При использовании интерфейса администратора для создания более 1 объекта foo, где bar имеет значение null, он дает мне ошибку: "Foo с этой панелью уже существует".
Однако когда я вставляю в базу данных (PostgreSQL):
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Это работает, просто отлично, это позволяет мне вставлять более 1 записи с нулевым баром, поэтому база данных позволяет мне делать то, что я хочу, это просто что-то не так с моделью Django. Любые идеи?
ИЗМЕНИТЬ
Переносимость решения по БД не является проблемой, мы довольны Postgres. Я пробовал настройку, уникальную для вызываемого, которая была моей функцией, возвращающей True/False для определенных значений бара, она не выдавала никаких ошибок, однако такой шов не имел никакого эффекта.
До сих пор я удалял уникальный спецификатор из свойства bar и обрабатывал уникальность штриха в приложении, однако все еще искал более элегантное решение. Любые рекомендации?