Mam model Foo, który ma pasek pola. Pole słupka powinno być unikalne, ale dopuszczać w nim wartości null, co oznacza, że chcę zezwolić na więcej niż jeden rekord, jeśli pole słupka jest null
, ale jeśli tak nie jest, null
wartości muszą być unikalne.
Oto mój model:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
A oto odpowiedni kod SQL dla tabeli:
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)
)
Kiedy używam interfejsu administratora do tworzenia więcej niż 1 obiektów foo, gdzie bar jest pusty, pojawia się błąd: „Foo z tym paskiem już istnieje”.
Jednak kiedy wstawiam do bazy danych (PostgreSQL):
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
To działa, po prostu dobrze, pozwala mi wstawić więcej niż 1 rekord z pustym słupkiem, więc baza danych pozwala mi robić co chcę, po prostu coś jest nie tak z modelem Django. Jakieś pomysły?
EDYTOWAĆ
Przenośność rozwiązania o ile DB nie jest problemem, jesteśmy zadowoleni z Postgres. Próbowałem ustawić unikalny dla wywoływanego, co było moją funkcją zwracającą True / False dla określonych wartości słupka , nie dawało to żadnych błędów, jednak zszywane tak, jakby nie miało żadnego efektu.
Do tej pory usunąłem unikalny specyfikator z właściwości paska i obsługuję unikalność paska w aplikacji, jednak nadal szukam bardziej eleganckiego rozwiązania. Jakieś zalecenia?
def get_db_prep_value(self, value, connection, prepared=False)
jako wywołania metody. Sprawdzić groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ więcej informacji. U mnie też działa następująca metoda: def get_prep_value (self, value): if value == "": #if Django spróbuje zapisać ciąg „”, wyślij db None (NULL) return None else: return value #otherwise, just przekazać wartość