DRF序列化和反序列化
生活随笔
收集整理的這篇文章主要介紹了
DRF序列化和反序列化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、自定義序列化組件
- 新建一個任意名的py文件,里面導入serlizer
from rest_framework import serializers 自定義一個類繼承serializers,里面寫需要序列化的字段- 方法一:繼承serializers.Serializer
class BookSerlizer(serializers.Serializer):title = serializers.CharField()price = serializers.IntegerField()pub_date = serializers.DateField()# source 可以指定一個字段也可以指定一個方法publish = serializers.CharField(source='publish.name')# 獲取作者所有的信息,指定SerializerMethodField之后,可以對應一個方法,返回什么內容,authors就是什么內容authors = serializers.SerializerMethodField(read_only=True)# 對應的方法固定寫法get_字段名def get_authors(self, obj):author_ser = AuthorSerlizer(obj.authors.all(), many=True)return author_ser.data方法二:繼承serializers.ModelSerializer
class BookSerializer(serializers.ModelSerializer):class Meta:model=models.Book# fields=('nid','name')#不能跟fields同時使用# exclude=['name',]fields=('__all__')#深度是1,官方建議不要超過10,個人建議不要超過3# depth=1authors=serializers.SerializerMethodField()def get_authors(self,obj):ret=AuthorSerializer(instance=obj.authors.all(),many=True)return ret.dataname=serializers.CharField()
- 視圖層
class Books(APIView):def get(self, request):back_dic = {'code': 100,'msg': '查詢成功',}# 獲取所有的圖書數據books = models.Book.objects.all()# print(books)# 序列化數據,many為True序列化多條數據,false序列化一條數據# instance 序列化,data 反序列化book_ser = BookSerlizer(instance=books, many=True)# print(book_ser)# 獲取序列化后的數據back_dic['data'] = book_ser.dataprint(back_dic)return Response(back_dic)
二、高級用法
1.source 的用法
- 可以指向字段
from rest_framework import serializersclass BookSerializer(serializers.Serializer):book_name = serializers.CharField(source='book')price = serializers.CharField()# 指向字段名publish = serializers.CharField(source='publish.name')可以指定方法
class BookSerializer(serializers.ModelSerializer):# 指向方法book_type =serializers.CharField(source='get_xx_display',read_only=True)
三、序列化總結
-序列化的兩種方式 -Serializers:沒有指定表模型-source:指定要序列化哪個字段,可以是字段,可以是方法- SerializerMethodField的用法authors=serializers.SerializerMethodField()def get_authors(self,obj):ret=AuthorSerializer(instance=obj.authors.all(),many=True)return ret.data-ModelSerializers:指定了表模型class Meta:model=表模型#要顯示的字段fields=('__all__')fields=('id','name')#要排除的字段exclude=('name')#深度控制depth=1
-重寫某個字段在Meta外部,重寫某些字段,方式同Serializers
四、反序列化
1、使用繼承了Serializers序列化類的對象
- 序列化生成器中:自己重寫create方法保存數據
def create(self, validated_data):# print('1',validated_data)publish = validated_data.pop('publish')publish_obj = models.Publish.objects.filter(name=publish['name']).first()# print(publish_obj)validated_data['publish'] = publish_objres = models.Book.objects.create(**validated_data)return res視圖層
def post(self, request):back_dic = {'code': 100,'msg': '',}# 反序列化傳入databook_ser = BookSerlizer(data=request.data)# print('1',request.data)# 校驗數是否合法print(book_ser.is_valid())# print(book_ser.errors)if book_ser.is_valid():print(book_ser.validated_data)book_ser.create(book_ser.validated_data)back_dic['data'] = book_ser.validated_databack_dic['msg'] = '新增成功'# print(back_dic)return Response(back_dic)
2、使用繼承了ModelSerializers序列化類的對象,反序列化
- 序列化生成器中不需要修改
- 視圖函數中直接調用save方法
def post(self,request):bookser=BookSerializer(data=request.data)if bookser.is_valid():ret=bookser.save()return Response()
五、反序列化的校驗——鉤子函數
- 局部鉤子
def validate_name(self,value):print(value)if value.startswith('sb'):raise exceptions.ValidationError('不能以sb開頭')return value全局鉤子
def validate(self,attrs):print(attrs)if attrs.get('price')!=attrs.get('xx'):raise exceptions.ValidationError('name和price相等,不正常')return attrs反序列化的校驗
??????? -validate_字段名(self,value):
??????????? -如果校驗失敗,拋出ValidationError(拋出的異常信息需要去bookser.errors中取)
??????????? -如果校驗通過直接return value
??????? -validate(self,attrs)
??????????? -attrs所有校驗通過的數據,是個字典
??????????? -如果校驗失敗,拋出ValidationError
??????????? -如果校驗通過直接return attrs
轉載于:https://www.cnblogs.com/king-home/p/11126427.html
總結
以上是生活随笔為你收集整理的DRF序列化和反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像处理随笔知识
- 下一篇: 义乌打一次水光针要多少钱