2016-04-04 18 views
1

Ben böyle bir Django modeli, bir şey var:Django: sadece belirli model alanını temizle?

class MyModel(models.Model): 
    no_validation = models.PositiveIntegerField(null=True, db_index=True) 
    yes_validation = models.CharField(max_length=254, validators=[my_validator]) 

Ben de şöyle bir şey önceden kaydetmek kanca vardır:

@receiver(pre_save, sender=MyModel)           
def run_full_clean(sender, instance, **kwargs):         
    instance.clean_fields() 

Sorunum bu mevcut yaklaşımın tüm alanları temizler olmasıdır. Sadece belirli bir alanı temizlemek istiyorum (yes_validation adı verilen). Bunu yapmanın kolay bir yolu var mı?

Yalnızca exclude parametresinin farkındayım, ancak sorun, sınıfımın neredeyse yüz farklı alanı var ve bu yüzden her birini hariç tutmak biraz kirli olabilir.

cevap

2

clean_fields yöntemini kullanmak yerine clean yöntemini geçersiz kılabilirsiniz. django docs alıntı:

Model.clean()

Bu yöntem, özel bir modeli doğrulama sağlamak ve arzu edildiği takdirde model üzerine özelliklerini değiştirmek için kullanılır. örneğinde, otomatik olarak alanı için bir değer sağlamak veya tek bir alanından daha fazlasına erişim gerektiren bir doğrulama yapmak için kullanabilirsiniz.

Doğrulama yapmanın bu yönteminden emin olmadığımdan emin değilim çünkü modellerde verileri doğrulamıyorum. Bana göre modeller sadece veriyi tanımlayan veritabanı şemasıdır, giriş kaynağındaki verileri doğrulamak için elinizden gelenin en iyisini yapmalısınız, çoğunlukla kullanılan bir tanesi Form'dur. Django formu, verileri doğrulamak için çok iyi bir api sahiptir, bu yüzden pre_save sinyalini kullanmak yerine bununla vakit geçirmenizi öneririm. Bu da hata ayıklamayı çok daha kolay hale getirir.