역서열화

22882 단어

1. 검증


반서열화된 데이터를 얻기 전에 is 를 호출해야 합니다valid() 메서드를 검증하여 True로 성공적으로 반환하거나 그렇지 않으면 False로 반환합니다.
검증에 실패했습니다. 서열화기 대상의 errors 속성을 통해 오류 정보를 얻을 수 있으며, 사전으로 되돌아갈 수 있습니다. 필드와 필드의 오류가 포함되어 있습니다.필드 오류가 아닌 경우 REST-framework 구성에서 NON 을 수정할 수 있습니다.FIELD_ERRORS_KEY는 잘못된 사전의 키 이름을 제어합니다.
검증이 성공했습니다. 서열화기 대상의validated 를 통해데이터 속성이 데이터를 가져옵니다.
서열화기를 정의할 때, 각 필드의 서열화 유형과 옵션 파라미터를 가리키는 것 자체가 검증 행위이다.
앞서 정의한 BookInfoSerializer
class BookInfoSerializer(serializers.Serializer):
    """ """
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label=' ', max_length=20)
    bpub_date = serializers.DateField(label=' ', required=False)
    bread = serializers.IntegerField(label=' ', required=False)
    bcomment = serializers.IntegerField(label=' ', required=False)
    image = serializers.ImageField(label=' ', required=False)

서열화기 대상을 구성하고 반서열화할 데이터를 데이터 구조 파라미터에 전달하여 검증한다
from booktest.serializers import BookInfoSerializer
data = {'bpub_date': 123}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()  #  False
serializer.errors
# {'btitle': [ErrorDetail(string='This field is required.', code='required')], 'bpub_date': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')]}
serializer.validated_data  # {}

data = {'btitle': 'python'}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()  # True
serializer.errors  # {}
serializer.validated_data  #  OrderedDict([('btitle', 'python')])

is_valid () 방법은 검증에 실패할 때 이상serializers를 던질 수 있습니다.ValidationError, raise를 전달할 수 있음exception=True 매개 변수가 켜져 있으며 REST 프레임워크가 이 예외를 수신하면 HTTP 400 Bad Request 응답을 프런트엔드로 반환합니다.
# Return a 400 response if the data was invalid.
serializer.is_valid(raise_exception=True)

이러한 사항이 충분하지 않다고 생각되면 검증 동작을 추가로 정의해야 하며 다음 세 가지 방법을 사용할 수 있습니다.
1)validators
필드에validators 옵션 파라미터를 추가하거나 검증 행위를 보충할 수 있습니다.
def about_django(value):
    if 'django' not in value.lower():
        raise serializers.ValidationError(" Django ")

class BookInfoSerializer(serializers.Serializer):
    """ """
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label=' ', max_length=20, validators=[about_django])
    bpub_date = serializers.DateField(label=' ', required=False)
    bread = serializers.IntegerField(label=' ', required=False)
    bcomment = serializers.IntegerField(label=' ', required=False)
    image = serializers.ImageField(label=' ', required=False)

테스트:
from booktest.serializers import BookInfoSerializer
data = {'btitle': 'python'}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()  # False   
serializer.errors
#  {'btitle': [ErrorDetail(string=' Django ', code='invalid')]}

2) validate_ 필드를 검증합니다.
class BookInfoSerializer(serializers.Serializer):
    """ """
    ...

    def validate_btitle(self, value):
        if 'django' not in value.lower():
            raise serializers.ValidationError(" Django ")
        return value

테스트
from booktest.serializers import BookInfoSerializer
data = {'btitle': 'python'}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()  # False   
serializer.errors
#  {'btitle': [ErrorDetail(string=' Django ', code='invalid')]}

3)validate
서열화기에서 여러 필드를 동시에 비교 검증해야 할 때validate 방법을 정의하여 검증할 수 있습니다. 예를 들어
class BookInfoSerializer(serializers.Serializer):
    """ """
    ...

    def validate(self, attrs):
        bread = attrs['bread']
        bcomment = attrs['bcomment']
        if bread < bcomment:
            raise serializers.ValidationError(' ')
        return attrs

테스트
from booktest.serializers import BookInfoSerializer
data = {'btitle': 'about django', 'bread': 10, 'bcomment': 20}
s = BookInfoSerializer(data=data)
s.is_valid()  # False
s.errors
#  {'non_field_errors': [ErrorDetail(string=' ', code='invalid')]}

REST 프레임워크에서 제공하는 validators:
UniqueValidator
단일 필드 유일:
from rest_framework.validators import UniqueValidator

slug = SlugField(
    max_length=100,
    validators=[UniqueValidator(queryset=BlogPost.objects.all())]
)

UniqueTogetherValidation
유일하다
from rest_framework.validators import UniqueTogetherValidator

class ExampleSerializer(serializers.Serializer):
    # ...
    class Meta:
        validators = [
            UniqueTogetherValidator(
                queryset=ToDoItem.objects.all(),
                fields=('list', 'position')
            )
        ]

2. 저장


검증에 성공하면validated데이터는 데이터 대상의 생성을 완성하고create()와 update() 두 가지 방법으로 실현할 수 있습니다.
class BookInfoSerializer(serializers.Serializer):
    """ """
    ...

    def create(self, validated_data):
        """ """
        return BookInfo(**validated_data)

    def update(self, instance, validated_data):
        """ ,instance """
        instance.btitle = validated_data.get('btitle', instance.btitle)
        instance.bpub_date = validated_data.get('bpub_date', instance.bpub_date)
        instance.bread = validated_data.get('bread', instance.bread)
        instance.bcomment = validated_data.get('bcomment', instance.bcomment)
        return instance

만약 데이터 대상을 되돌릴 때도 데이터베이스에 저장해야 한다면 다음과 같은 수정을 할 수 있다
class BookInfoSerializer(serializers.Serializer):
    """ """
    ...

    def create(self, validated_data):
        """ """
        return BookInfo.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """ ,instance """
        instance.btitle = validated_data.get('btitle', instance.btitle)
        instance.bpub_date = validated_data.get('bpub_date', instance.bpub_date)
        instance.bread = validated_data.get('bread', instance.bread)
        instance.bcomment = validated_data.get('bcomment', instance.bcomment)
        instance.save()
        return instance

상기 두 가지 방법을 실현한 후 데이터를 반서열화할 때save() 방법을 통해 데이터 대상의 실례를 되돌릴 수 있다
book = serializer.save()

서열화기 대상을 만들 때 instance 실례를 전달하지 않으면 save () 방법을 호출할 때create () 가 호출되고, 반대로 instance 실례를 전달할 때save () 방법을 호출할 때 update () 가 호출됩니다.
from db.serializers import BookInfoSerializer
data = {'btitle': ' '}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()  # True
serializer.save()  # 

from db.models import BookInfo
book = BookInfo.objects.get(id=2)
data = {'btitle': ' '}
serializer = BookInfoSerializer(book, data=data)
serializer.is_valid()  # True
serializer.save()  # 
book.btitle  # ' '

두 가지 설명:
1) 서열화기를save()로 저장할 때 데이터를 추가로 전달할 수 있으며, 이 데이터는create()와 update()의validated데이터 매개 변수 가져오기
serializer.save(owner=request.user)

2) 기본 서열화기는 모든 Required 필드를 전달해야 하며, 그렇지 않으면 검증 이상이 발생합니다.그러나 일부 필드의 업데이트를 허용하기 위해partial 파라미터를 사용할 수 있습니다
# Update `comment` with partial data
serializer = CommentSerializer(comment, data={'content': u'foo bar'}, partial=True)

좋은 웹페이지 즐겨찾기