역서열화
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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.