У мене є модель Foo, у якій є смуга поля. Поле смуги повинно бути унікальним, але допускати в ньому нулі, тобто я хочу дозволити більше одного запису, якщо поле бар є 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-об’єктів, де бар є нульовим, це дає мені помилку: "Foo з цією смужкою вже існує".
Однак коли я вставляю в базу даних (PostgreSQL):
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Це працює просто чудово, це дозволяє мені вставити більше 1 запису, коли бар є нульовим, тому база даних дозволяє мені робити те, що я хочу, це просто щось не так з моделлю Django. Будь-які ідеї?
EDIT
Переносимість рішення, наскільки БД не є проблемою, ми задоволені Postgres. Я спробував встановити унікальний для виклику, який був моєю функцією, що повертає True / False для конкретних значень смуги , вона не давала жодних помилок.
Поки що я видалив унікальний специфікатор із властивості бар та керував унікальністю бар у додатку, проте все ще шукаю більш елегантне рішення. Будь-які рекомендації?
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 == "": #if Django намагається зберегти рядок '', надіслати db None (NULL) return Ніщо інше: return value #otherwise, just передайте значення