zoukankan      html  css  js  c++  java
  • django文档总结之DRF、序列化(5)

    序列化与反序列化

    一种对于数据的操作,将数据进行格式转换

    序列化操作:将python类型转换成json

    反序列化操作:将json转换成python类型

    DRF

    提供的功能:1.序列化 2.视图 3.路由

    1 安装DRF: pip install djangorestframework

    2 添加rest_framework应用: 'rest_framework

    3 新建serializers.py用于创建序列化器

    	class BookInfoSerializer(serializers.ModelSerializer):
    		class Meta:
    			model = BookInfo  --model指明该序列化器处理的数据字段从模型类BookInfo参考生成
    			fields = '__all__' --fields 指明该序列化器包含模型类中的哪些字段,'__all__'指明包含所有字段
    

    4 编写视图

    	class BookViewSet(ModelViewSet):
    		queryset = BookInfo.objects.all()  --queryset 指明该视图集在查询数据时使用的查询集
    		serializer_class = BookInfoModelSerializer  --serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器
    

    5 定义路由

    	from rest_framework.routers import DefaultRouter
    	router = DefaultRouter()  -----可以处理视图的路由器
    	router.register('book', views.BookViewSet) -----向路由器中注册视图集
    	urlpatterns += router.urls  -----将路由器中的所以路由信息追到到django的路由列表中
    

    定义Serializer序列化器

    定义方法:在serializers.py中定义类,继承自rest_framework.serializers.Serializer

    	class BookInfoSerializer(serializers.Serializer):
    		属性名(同model中一致) = serializers.字段类型(laber='汉化名',参数名称,)
    

    创建Serializer对象

    	Serializer(instance=None, data=empty, **kwarg)
    	1)用于序列化时,将模型类对象传入instance参数
    	2)用于反序列化时,将要被反序列化的数据传入data参数
    

    序列化操作

    1 将python类型对象转换成字典:

    	1.查询对象
    	2.构造序列化器的对象
    		说明:如果查询结果包含多个对象,则指定many=True
    	3.调用序列化器的对象属性data获取序列化后的字典
    

    单一对象的序列化 views里视图函数

    def hero(request):    
        hero1 = HeroInfo.objects.get(pk=1)  # 查询对象
    	hero_serializer = HeroInfoSerializer(hero1) # 创建序列化对象,以对象为参数
    	hero_dict = hero_serializer.data  # 调用属性data返回序列化的结果
    	print(hero_dict)  # {'name': '郭靖', 'id': 1, 'content': '降龙十八掌'}
    	return JsonResponse({'hero_dict': hero_dict})  # 返回浏览器json格式
    

    多对象的序列化

        hlist = HeroInfo.objects.filter(book_id=1)
    	hero_serializer = HeroInfoSerializer(hlist, many=True)
    	hlist2 = hero_serializer.data
    	return JsonResponse({'hlist': hlist2})
    

    2 对于关联属性进行输出的方案:在serializers.py文件

    	注意:指定read_only=True
    	# 1.以主键的形式输出  book = serializers.PrimaryKeyRelatedField(read_only=True)
    	# 2.以字符串的形式输出  book = serializers.StringRelatedField(read_only=True)
    	# 3.以超链接的形式输出  book = serializers.HyperlinkedRelatedField(read_only=True, view_name='booktest:book2')
    	# 4.指定对象的某个属性输出 book = serializers.SlugRelatedField(read_only=True, slug_field='pub_date')
    	# 5.指定关联对象的序列化器输出  book = BookInfoSerializer(read_only=True)
    	# 6.自定义输出方案   先自定义类,再 book = BookRelatedField(read_only=True)
    	说明:如果关联属性包含多个对象,则指定many=True
    

    反序列化操作:将json接收 转换成字典

    1 验证

    	1.字段的类型
    	2.必填验证,默认required为True
    		特例:default,read_only
    		如果想不传此数据,可以设置required=False
    	3.定义方法,验证某个属性
    		def validate_属性名称(self,attr):
    			attr表示对应的属性
    			pass
    	4.多属性验证
    		def validate(self,attrs):
    			attrs表示属性的字典
    			pass
    	5.定义类型时可以指定validators参数,指向验证方法
    

    验证某个属性:在serializers.py中定义方法,再在views里进行反序列化操作(见代码)

    	def validate_name(self, attr):
    		if not attr.startswith('张'):
    			raise serializers.ValidationError('英雄必须姓张')
    		return attr
    

    验证多个属性:在serializers.py中定义方法,再在views里进行反序列化操作(见代码)

    	def validate(self, attrs):
    		bread = attrs.get('bread')
    		comment = attrs.get('comment')
    		if bread and comment:
    			if bread < comment:
    				raise serializers.ValidationError('阅读量必须大于评论量')
    		return attrs
    

    2 保存:见代码

    	调用:save()
    	#增加:BookInfoSerializer(data=json)==>save()
    

    修改:BookInfoSerializer(book,data=json)==>save()

    	定义create():添加
    	定义update():修改
    

    模型类序列化器ModelSerializer :具体见代码

    如果序列器是与模型类对应的,则推荐继承自这个类,代码更简单

    ​ Serializer:不同模型类对应

    ​ ModelSerializer:与模型类对应

    ​ 隐藏的属性需要单独定义

    ​ 对于create()、update()方法不需要定义,直接调用save()方法就可以完成保存

  • 相关阅读:
    HTMLPARSER.NET 参考资料
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
    C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
    处理Selection对象和Range对象——Word VBA中重要的两个对象
    C# word开发
    c# 解析JSON的几种办法
    NameValueCollection详解
    解析jquery获取父窗口的元素
    Window_Open详解
    Implementing Remote Validation in MVC
  • 原文地址:https://www.cnblogs.com/davis12/p/14376873.html
Copyright © 2011-2022 走看看