Ich habe Modell Foo, das Feldleiste hat. Das Balkenfeld sollte eindeutig sein, aber Nullen zulassen, was bedeutet, dass ich mehr als einen Datensatz zulassen möchte, wenn das Balkenfeld vorhanden ist null
, aber wenn dies nicht null
der Fall ist , müssen die Werte eindeutig sein.
Hier ist mein Modell:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
Und hier ist die entsprechende SQL für die Tabelle:
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)
)
Wenn ich die Admin-Oberfläche verwende, um mehr als 1 foo-Objekte zu erstellen, bei denen der Balken null ist, wird der Fehler angezeigt: "Foo mit diesem Balken ist bereits vorhanden."
Wenn ich jedoch in die Datenbank (PostgreSQL) einfüge:
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Dies funktioniert, ganz gut, es ermöglicht mir, mehr als einen Datensatz einzufügen, wobei der Balken null ist. Die Datenbank ermöglicht mir also, das zu tun, was ich will. Es stimmt einfach nicht mit dem Django-Modell. Irgendwelche Ideen?
BEARBEITEN
Die Portabilität der Lösung für die DB ist kein Problem, wir sind mit Postgres zufrieden. Ich habe mit einem abrufbaren einzigartigen versucht Einstellung, die meine Funktion Wahr / Falsch für bestimmte Werte von zurückkehrt bar , es hat keine Fehler geben, aber gefalzt wie es keinen Effekt auf alle hatte.
Bisher habe ich den eindeutigen Bezeichner aus der Balkeneigenschaft entfernt und die Eindeutigkeit der Balken in der Anwendung behandelt, suche jedoch immer noch nach einer eleganteren Lösung. Irgendwelche Empfehlungen?
def get_db_prep_value(self, value, connection, prepared=False)
als Methodenaufruf benötigen . Weitere Informationen finden Sie unter groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ . Die folgende Methode funktioniert auch für mich: def get_prep_value (self, value): Wenn value == "": #wenn Django versucht, einen String zu speichern, senden Sie die Datenbank None (NULL) return None else: Rückgabewert #otherwise, just Übergeben Sie den Wert