Eu tenho o modelo Foo que tem barra de campo. O campo da barra deve ser exclusivo, mas permitir nulos, o que significa que desejo permitir mais de um registro se o campo da barra for null
, mas se não for, null
os valores deverão ser exclusivos.
Aqui está o meu modelo:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
E aqui está o SQL correspondente para a tabela:
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)
)
Ao usar a interface de administração para criar mais de 1 objeto foo em que a barra é nula, ocorre um erro: "O foo com esta barra já existe".
No entanto, quando insiro no banco de dados (PostgreSQL):
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Isso funciona, muito bem, me permite inserir mais de 1 registro com a barra sendo nula, então o banco de dados permite que eu faça o que eu quero, é apenas algo errado com o modelo do Django. Alguma ideia?
EDITAR
A portabilidade da solução no que diz respeito ao DB não é um problema, estamos felizes com o Postgres. Eu tentei definir exclusivo para um callable, que era minha função retornando True / False para valores específicos de bar , não dava nenhum erro, por mais costurado como se não tivesse nenhum efeito.
Até agora, removi o especificador exclusivo da propriedade da barra e lidei com a exclusividade da barra no aplicativo, mas ainda estou procurando uma solução mais elegante. Alguma recomendação?
def get_db_prep_value(self, value, connection, prepared=False)
como chamada de método. Consulte groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ para obter mais informações. O método a seguir também funciona para mim: def get_prep_value (self, value): if value == "": #if Django tenta salvar '' string, envie o retorno db None (NULL) passa o valor