Alan çubuğu olan Foo modelim var. Bar alanı benzersiz olmalıdır, ancak buna null değerlerine izin verin, yani bar alanı ise birden fazla kayda izin vermek istiyorum null
, ancak değilse null
değerler benzersiz olmalıdır.
İşte benim modelim:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
Ve tablo için karşılık gelen 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)
)
Çubuğun boş olduğu 1'den fazla foo nesnesi oluşturmak için admin arabirimini kullanırken bana bir hata veriyor: "Bu Çubuğa sahip Foo zaten var."
Ancak veritabanına (PostgreSQL) eklediğimde:
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Bu işe yarıyor, iyi, bar null olan 1'den fazla kayıt eklememe izin veriyor, bu yüzden veritabanı istediğimi yapmama izin veriyor, bu Django modelinde yanlış bir şey. Herhangi bir fikir?
DÜZENLE
DB'nin bir çözüm olmadığı sürece çözümün taşınabilirliği, Postgres'den memnunuz. Çubuğun belirli değerleri için True / False döndüren işlevim olan bir callable için benzersiz ayar yapmayı denedim , ancak herhangi bir etkisi olmadığı gibi eklenmiş, herhangi bir hata vermedi.
Şimdiye kadar, benzersiz özellikli bar özelliğinden çıktım ve uygulamadaki bar benzersizliğini ele aldım , ancak yine de daha zarif bir çözüm arıyorum. Herhangi bir tavsiye?
def get_db_prep_value(self, value, connection, prepared=False)
yöntem çağrısı olarak gerekir . Daha fazla bilgi için groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ adresini kontrol edin . Aşağıdaki yöntem de benim için çalışıyor: def get_prep_value (self, value): if value == "": #if Django '' dizesini kaydetmeye çalışırsa, db'yi gönderin None (NULL) return Hiçbiri: return value #otherwise, just değeri geçmek