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

  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • Kyletiv7

    Kyletiv7

    28 Mayıs 2007
  • TheSalband Rai

    TheSalband R

    11 NİSAN 2011