IT TIP

Django 모델 필드 유효성 검사

itqueen 2020. 12. 12. 12:54
반응형

Django 모델 필드 유효성 검사


Django에서 모델 필드 의 유효성 검사는 어디로 가야합니까?

모델의 오버로드 된 .save () 메서드 또는 models.Field 하위 클래스의 .to_python () 메서드 (분명히 작동하려면 사용자 지정 필드를 작성해야 함)의 두 가지 가능한 선택 항목을 지정할 수 있습니다.

가능한 사용 사례 :

  • 절대적으로 필요한 경우 빈 문자열이 데이터베이스에 기록되지 않도록합니다 (blank = False 키워드 인수는 여기서 작동하지 않으며 양식 유효성 검사 전용입니다).
  • 보장 할 필요가있을 때 "choces"키워드 인수가 관리 인터페이스뿐만 아니라 db 수준에서도 존중됩니다 (열거 형 데이터 유형을 에뮬레이트하는 종류).

모델에는 클래스 수준 속성도 empty_strings_allowed있습니다. 필드 기본 클래스 정의와 파생 클래스는 기꺼이 재정의하지만 데이터베이스 수준에 영향을주지 않는 것 같습니다. 즉, 빈 문자열 필드로 모델을 구성 할 수 있습니다. 데이터베이스에 저장합니다. 피하고 싶은 것 (예, 필요합니다).

가능한 구현은 다음과 같습니다.

필드 수준에서 :

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)

모델 수준에서 :

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)

아마도 내가 뭔가를 놓치고 있는데 이것은 더 쉽고 더 깨끗하게 할 수 있습니까?


Django는 버전 1.2부터 모델 유효성 검사 시스템을 갖추고 있습니다.

코멘트에서 sebpiq는 "좋아, 이제 ModelForm을 사용할 때만 실행된다는 점을 제외하면 모델 유효성 검사를 할 수있는 곳이 있습니다! 따라서 유효성 검사가 db 수준에서 준수되는지 확인해야 할 때 문제가 남아 있습니다. , 어떻게해야합니까? full_clean은 어디로 전화해야합니까? "

Python 수준 유효성 검사를 통해 유효성 검사가 db 수준에서 준수되는지 확인할 수 없습니다. 가장 가까운 방법은 아마도 full_clean재정의 된 save메서드 를 호출 하는 것입니다 . 이것은 기본적으로 수행되지 않습니다. 왜냐하면 save 메소드를 호출하는 모든 사람이 이제 ValidationError.

하지만 이렇게해도 누군가를 사용하여 대량으로 모델 인스턴스를 업데이트 할 수 queryset.update()있으므로이 유효성 검사를 우회합니다. Django가 queryset.update()업데이트 된 모든 객체에 대해 Python 수준의 유효성 검사를 수행 할 수 있는 합리적으로 효율적인 구현 방법은 없습니다 .

실제로 db 수준의 무결성을 보장하는 유일한 방법은 db 수준의 제약을 통하는 것입니다. ORM을 통해 수행하는 모든 유효성 검사를 수행하려면 앱 코드 작성자가 유효성 검사가 시행되는시기를 인식하고 유효성 검사 실패를 처리해야합니다.

이것이 모델 유효성 검사가 기본적으로 만 적용되는 ModelForm이유입니다. ModelForm에는 이미 ValidationError.


나는 당신이 이것을 원한다고 생각합니다->

from django.db.models.signals import pre_save

def validate_model(sender, **kwargs):
    if 'raw' in kwargs and not kwargs['raw']:
        kwargs['instance'].full_clean()

pre_save.connect(validate_model, dispatch_uid='validate_models')

( http://djangosnippets.org/snippets/2319/ 에서 복사 )


The root issue for this, is that the validation should happen on models. This has been discussed for quite some time in django (search form model aware validation on the dev mailing list). It leads to either duplication or things escaping validation before hitting the db.

While that doesn't hit trunk, Malcolm's "poor man's model validation solution" is probably the cleanest solution to avoid repeating yourself.


If I understand you "clearly" - you must override function get_db_prep_save instead of to_python

참고URL : https://stackoverflow.com/questions/1624782/django-model-fields-validation

반응형