SORU
18 Ocak 2009, Pazar


Boş değerlere izin Django benzersiz alanları

Alan bar olan model Foo var. Bar alanı unque olmalı, ama içinde boşluk, bar alanı boş ise birden fazla kayıt izin vermek istiyorum, ama eğer değerleri unque olmalı boş değilse anlam sağlar.

İşte benim 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)

Ve işte bu 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)
)

Yönetici arayüzü bar, IS 1'den fazla foo nesneleri oluşturmak için kullanırken bana bir hata veriyor: "bu Bar Foo zaten var."

Ben veritabanına eklediğinizde ancak (PostgreSQL):

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

Bu işleri gayet iyi tanır beni Ekle daha fazla 1 Kayıt ile bar olmak null, veritabanı sağlar bana ne istiyorum, sadece bir şey yanlış ile Django model. Herhangi bir fikir?

EDİT

Bu çözüm taşınabilirlik kadarıyla DB bir sorun değildir, İsim memnunuz. Benim görevim, Doğru/Yanlış dönen bir çağrı, benzersiz ayarı belirli değerler için çalıştımbarherhangi bir hata vermedi , hiçbir etkisi yoktu gibi ancak dikişli.

Şimdiye kadar, benzersiz belirleyici çıkardımbarözellik ve kullanımbaruygulamada, ancak yine de daha şık bir çözüm arıyorsanız teklik. Herhangi bir öneriler?

CEVAP
9 EYLÜL 2009, ÇARŞAMBA


Django #9039 sabit olduğundan bilet teklik denetler amacıyla NULL eşit olması için BOŞ kabul etmemiştir, bkz

http://code.djangoproject.com/ticket/9039

Burada sorun "şeklinde bir CharField için değer boş bir dize, Hiçbiri değil." boş normalize olmasıdır Eğer bu alanı boş bırakırsanız, boş bir dize NULL, DB saklanan olsun. Boş dizeler hem Django ve veritabanı kuralları altında teklik kontroller için boş dizeler, eşittir.

Yönetici arayüzü Yok boş dizge döner clean_bar bir yöntem ile Foo için kendi özel model form sağlayarak, boş bir dize NULL saklamak için zorlayabilir:

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo
    def clean_bar(self):
        return self.cleaned_data['bar'] or None

class FooAdmin(admin.ModelAdmin):
    form = FooForm

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AlaskanGrizzly

    AlaskanGrizz

    30 EKİM 2009
  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • bunliu

    bunliu

    2 Mayıs 2007