Django model alanları doğrulama | Netgez.com
SORU
26 EKİM 2009, PAZARTESİ


Django model alanları doğrulama

Burada doÄŸrulama gerekirmodel alanlardjango?

En az iki olası seçenek sayabilirim: aşırı yüklü .() Kaydet modeli yöntemi .() to_python modellerin yöntemi.Alt (çalışması için, belli ki özel alanlar yazmanız gerekir) alanı.

Olası kullanım durumları:

  • kesinlikle gerekli saÄŸlamak için, boÅŸ bir dize veritabanına yazılı olmayan (boÅŸ=False anahtar deÄŸiÅŸkeni burada çalışmıyor, doÄŸrulama sadece form için)
  • saÄŸlamak için gerekli olduÄŸunda, "seçimler" anahtar deÄŸiÅŸkeni db düzeyinde ve sadece admin saygın alır arabirim (numaralandırma veri türü taklit gibi)

Ayrıca modellerde sınıf düzeyinde bir öznitelik empty_strings_allowed var.Alan tanımı temel sınıf ve türetilmiş sınıflar geçersiz kılma mutlu değil, ancak bu gibi görünmüyor üretmek herhangi bir etkisi üzerinde veritabanı düzeyinde, yani ben hala inşa modeli ile boş dize alanları ve kaydetmek için veritabanı. Önlemek için (Evet, gerekli olur) istiyorum.

Olası uygulamaları vardır

sahada seviyesi:

class CustomField(models.CharField):
    __metaclass__ = models.SubfieldBase
    def to_python(self, value):
        if not value:
            raise IntegrityError(_('Empty string not allowed'))
        return models.CharField.to_python(self, value)

model seviyesi:

class MyModel(models.Model)
    FIELD1_CHOICES = ['foo', 'bar', 'baz']
    field1 = models.CharField(max_length=255, 
               choices=[(item,item) for item in FIELD1_CHOICES])

    def save(self, force_insert=False, force_update=False):
        if self.field1 not in MyModel.FIELD1_CHOICES:
            raise IntegrityError(_('Invalid value of field1'))
        # this can, of course, be made more generic
        models.Model.save(self, force_insert, force_update)

Belki de, ben bir şey eksik ve bu daha kolay ve daha temiz yapılabilir mi?

CEVAP
26 EKİM 2009, PAZARTESİ


Django sürüm 1.2 beri yerde model validation bir sistem vardır.

Yorum sebpiq "Tamam, şimdi model doğrulama koymak için bir yer ... ModelForm! bir kullanarak sadece koşmak dışında olmadığını söylüyor Soru doğrulama db düzey, en saygı duyulması gerektiği durumda kalır, o yüzden ne yapmalıyım? Nerede full_clean?" diye

Python-seviye doğrulama db düzeyinde saygın olduğundan emin olmak için doğrulama ile mümkün değil. En yakın büyük ihtimalle bir geçersiz kılınmış full_clean arama save yöntem. Bu yöntem tasarruf diyen herkes şimdi daha iyi yakalamak ve ValidationError hazırlıklı olmak zorunda anlamına gelir, çünkü varsayılan olarak bitmiş değil.

Ama eğer bunu yaparsanız bile, birileri hala toplu olarak model örneklerini bu doğrulama bypass queryset.update() kullanarak güncelleme yapabilirsiniz. Django oldukça verimli hala gerçekleştirebilecek queryset.update() Python düzey doğrulama güncellenen her nesne üzerinde uygulamak yolu yok.

Tek yolu gerçekten garanti db düzeyinde bütünlüğü ile db düzeyi kısıtlamaları; herhangi bir doğrulama yapmak ile ORM gerektirir yazar uygulama koduna dikkat edin ne zaman doğrulama zorlanan (ve kolu doğrulama hataları).

Bu model doğrulama varsayılan olarak, yalnızca ValidationError işlemek için bariz bir yolu var bir ModelForm çünkü ModelForm - zorunlu olmasıdır.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CasinoRoyaleMovie's channel

    CasinoRoyale

    1 AÄžUSTOS 2006
  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • YAN TV

    YAN TV

    20 EKİM 2011