Unique champs qui autorise les valeurs null dans Django

J'ai le modèle Foo qui a barre champ. La barre de domaine doit être unique, mais autorise les valeurs null dans, ce qui signifie que je veux permettre à plus d'un enregistrement si la barre de champ est null, mais si elle n'est pas null les valeurs doivent être uniques.

Voici mon modèle:

class Foo(models.Model):
    name = models.CharField(max_length=40)
    bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)

Et voici le SQL correspondante de la table:

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)
)   

Lors de l'utilisation de l'interface d'administration pour créer plus de 1 foo objets où la barre est null, il me donne une erreur: "Foo avec cette Barre existe déjà."

Cependant lorsque je l'insère dans la base de données (PostgreSQL):

insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)

Cela fonctionne, très bien, cela me permet d'insérer plus de 1 enregistrement avec barre de nul, de sorte que la base de données me permet de faire ce que je veux, c'est juste quelque chose de mal avec l'Django modèle. Des idées?

MODIFIER

La portabilité de la solution autant que DB n'est pas un problème, nous sommes heureux avec Postgres.
J'ai essayé de réglage unique pour un callable, qui a été ma fonction qui renvoie True/False pour des valeurs spécifiques de bar, il ne donnait pas d'erreurs, cependant couture comme il n'a eu aucun effet du tout.

Jusqu'à présent, j'ai supprimé l'unique rédacteur de la bar de la propriété et de la manipulation du bar l'unicité dans l'application, toutefois, toujours à la recherche d'une solution plus élégante. Toutes les recommandations?

  • Je ne peux pas commenter mais alors, voici un peu plus de mightyhal: Depuis Django 1.4 vous devez def get_db_prep_value(self, value, connection, prepared=False) que l'appel de la méthode. Vérifier groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ pour plus d'informations. Méthode suivante fonctionne pour moi, trop: def get_prep_value(self, value): si la valeur=="": #si Django tente de sauver la " chaîne de caractères, envoyer la db Aucun (NULL) retourne Aucun autre: valeur de retour #sinon, il suffit de passer la valeur
  • J'ai ouvert un Django billet pour cette. Ajouter votre soutien. code.djangoproject.com/ticket/30210#ticket