У меня есть модель 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 с этим Bar уже существует».
Однако, когда я вставляю в базу данных (PostgreSQL):
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Это работает, просто отлично, это позволяет мне вставлять более 1 записи с нулевым баром, поэтому база данных позволяет мне делать то, что я хочу, это просто что-то не так с моделью Django. Любые идеи?
РЕДАКТИРОВАТЬ
Переносимость решения для DB не проблема, мы довольны Postgres. Я попытался установить уникальное значение для вызываемого объекта, так как моя функция возвращала True / False для определенных значений bar , он не выдавал никаких ошибок, однако показывал, что он вообще не имел никакого эффекта.
До сих пор я удалил уникальный спецификатор из свойства bar и обработал уникальность bar в приложении, однако все еще искал более элегантное решение. Любые рекомендации?
def get_db_prep_value(self, value, connection, prepared=False)
как вызов метода. Проверьте groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ для получения дополнительной информации. У меня тоже работает следующий метод: def get_prep_value (self, value): if value == "": # Если Django пытается сохранить '' строку, отправьте db None (NULL), верните None else: верните значение #otherwise, просто передать значение