development

django의 model.save ()가 full_clean ()을 호출하지 않는 이유는 무엇입니까?

big-blog 2020. 6. 22. 07:17
반응형

django의 model.save ()가 full_clean ()을 호출하지 않는 이유는 무엇입니까?


django의 orm이 모델 양식의 일부로 저장되지 않는 한 모델에서 'full_clean'을 호출하지 않는 이유가 있는지 아는 사람이 있는지 궁금합니다.

모델의 save () 메소드를 호출 할 때 full_clean ()이 자동으로 호출되지 않습니다. 직접 만든 모델에 대해 1 단계 모델 유효성 검사를 실행하려면 수동으로 호출해야합니다. django의 완전 깨끗한 의사

(참고 : Django 1.6에 대한 견적이 업데이트되었습니다 ... 이전 장고 문서는 ModelForms에 대해서도주의해야했습니다.)

사람들이이 행동을 원하지 않는 좋은 이유가 있습니까? 모델에 유효성 검사를 추가하는 데 시간이 걸린다면 모델을 저장할 때마다 유효성 검사를 실행하고 싶을 것입니다.

모든 것이 올바르게 작동하는 방법을 알고 있으며 설명을 찾고 있습니다.


AFAIK는 이전 버전과의 호환성 때문입니다. 필드가 제외 된 ModelForms, 기본값이있는 모델, pre_save () 신호 등에도 문제가 있습니다.

여러분이 모욕 할만한 출처 :


호환성을 고려하여 django 커널에서 자동 정리 저장을 사용할 수 없습니다.

새 프로젝트를 시작하고 saveModel 의 기본 방법이 자동으로 정리되도록하려면 모든 모델을 저장하기 전에 다음 신호를 사용하여 정리할 수 있습니다.

from django.dispatch import receiver
from django.db.models.signals import pre_save, post_save

@receiver(pre_save)
def pre_save_handler(sender, instance, *args, **kwargs):
    instance.full_clean()

full_clean메소드 를 호출하는 가장 간단한 방법은 다음에서 메소드를 대체 save하는 것입니다 model.

def save(self, *args, **kwargs):
    self.full_clean()
    return super(YourModel, self).save(*args, **kwargs)

수신자를 선언하는 코드를 삽입하는 대신 앱을 INSTALLED_APPS섹션으로 사용할 수 있습니다.settings.py

INSTALLED_APPS = [
    # ...
    'django_fullclean',
    # your apps here,
]

그 전에 django-fullcleanPyPI 를 사용 하여 설치해야 할 수도 있습니다 .

pip install django-fullclean

FK 관계가 하나 이상 있는지 확인하려는 모델이 null=False있고 기본 FK (가비지 데이터)를 설정해야 하기 때문에 사용하지 않으려는 경우 가장 좋은 방법은 사용자 정의 .clean().save()메소드 를 추가 합니다. .clean()유효성 검사 오류가 발생 .save()하고 정리를 호출합니다. 이런 식으로 무결성은 양식과 다른 호출 코드, 명령 줄 및 테스트에서 모두 시행됩니다. 이 옵션이 없으면 (AFAICT) 테스트를 작성하는 방법이 없으므로 모델이 특별히 선택된 (기본이 아닌) 다른 모델과 FK 관계를 갖도록합니다.

class Payer(models.Model):

    name = models.CharField(blank=True, max_length=100)
    # Nullable, but will enforce FK in clean/save:
    payer_group = models.ForeignKey(PayerGroup, null=True, blank=True,)

    def clean(self):
        # Ensure every Payer is in a PayerGroup (but only via forms)
        if not self.payer_group:
            raise ValidationError(
                {'payer_group': 'Each Payer must belong to a PayerGroup.'})

    def save(self, *args, **kwargs):
        self.full_clean()
        return super().save(*args, **kwargs)

    def __str__(self):
        return self.name

참고URL : https://stackoverflow.com/questions/4441539/why-doesnt-djangos-model-save-call-full-clean

반응형