序列化Serializer

序列化用于对用户请求数据进行验证和数据进行序列化(为了解决queryset序列化问题)。

那什么是序列化呢?序列化就是把对象转换成字符串,反序列化就是把字符串转换成对象

models部分

models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. class Group(models.Model):
  5. title = models.CharField(max_length=32)
  6. mu = models.ForeignKey(to='Menu',default=1)
  7.  
  8. class UserInfo(models.Model):
  9. name = models.CharField(max_length=32)
  10. pwd = models.CharField(max_length=32)
  11. group = models.ForeignKey(to="Group")
  12.  
  13. roles = models.ManyToManyField(to="Role")
  14. class Menu(models.Model):
  15. name = models.CharField(max_length=21)
  16.  
  17. class Role(models.Model):
  18. name = models.CharField(max_length=32)

基本操作

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework import serializers
  4. from app03 import models
  5. class UsersSerializer(serializers.Serializer):
  6. name = serializers.CharField() #字段名字
  7. pwd = serializers.CharField()
  8.  
  9. class UserView(APIView):
  10. def get(self,request,*args,**kwargs):
  11. # 方式一实现
  12. # user_list = models.UserInfo.objects.values('name','pwd','group__mu','group__title')
  13. # print(type(user_list))
  14. # return Response(user_list)
  15.  
  16. # 方式二之多对象
  17. # user_list = models.UserInfo.objects.all() #直接这样查会报错,借助他提供的系列化
  18. # ser = UsersSerializer(instance=user_list,many=True) #可允许多个
  19. # # print(type(ser)) #<class 'rest_framework.serializers.ListSerializer'>
  20. # print(ser.data) #返回的是一个有序字典
  21.  
  22. #方式三之单对象
  23. user = models.UserInfo.objects.all().first()
  24. ser = UsersSerializer(instance=user,many=False)
  25.  
  26. return Response(ser.data)

views.py

跨表

  1. x1 = serializers.CharField(source='group.mu.name')
  2. 如果你想跨表拿你任何需要的数据,都可以用上面的这种操作,内部做判断,如果可用内部就加括号调用了
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework import serializers
  4. from app03 import models
  5. class UsersSerializer(serializers.Serializer):
  6. name = serializers.CharField() #字段名字
  7. pwd = serializers.CharField()
  8. # group = serializers.CharField() #会显示对象
  9. # group_id = serializers.CharField() #会显示id
  10. x1 = serializers.CharField(source='group.mu.name')
  11. roles = serializers.CharField(source='roles.all') #多对多关系的这样查出的是queryset对象
  12.  
  13. class UserView2(APIView):
  14. '''跨表操作'''
  15. def get(self,request,*args,**kwargs):
  16.  
  17. user = models.UserInfo.objects.all()
  18. ser = UsersSerializer(instance=user,many=True)
  19.  
  20. return Response(ser.data)

Views.py

复杂序列化

解决方案一

  1. class MyCharField(serializers.CharField):
  2.  
  3. def to_representation(self, value): ##打印的是所有的数据
  4. data_list = []
  5. for row in value:
  6. data_list.append(row.name)
  7. return data_list
  8.  
  9. class UsersSerializer(serializers.Serializer):
  10. name = serializers.CharField() # obj.name
  11. pwd = serializers.CharField() # obj.pwd
  12. group_id = serializers.CharField() # obj.group_id
  13. xxxx = serializers.CharField(source="group.title") # obj.group.title
  14. x1 = serializers.CharField(source="group.mu.name") # obj.mu.name
  15. # x2 = serializers.CharField(source="roles.all") # 多对多关系的这样查出的是queryset对象
  16. x2 = MyCharField(source="roles.all") # obj.mu.name

Views.py

解决方案二

  1. class MyCharField(serializers.CharField):
  2. def to_representation(self, value):
  3. return {'id':value.pk, 'name':value.name}
  4.  
  5. class UsersSerializer(serializers.Serializer):
  6. name = serializers.CharField() # obj.name
  7. pwd = serializers.CharField() # obj.pwd
  8. group_id = serializers.CharField() # obj.group_id
  9. xxxx = serializers.CharField(source="group.title") # obj.group.title
  10. x1 = serializers.CharField(source="group.mu.name") # obj.mu.name
  11. # x2 = serializers.CharField(source="roles.all") # obj.mu.name
  12. x2 = serializers.ListField(child=MyCharField(),source="roles.all") # obj.mu.name

Views.py

解决方案三(推荐使用)

  1. class UsersSerializer(serializers.Serializer):
  2. name = serializers.CharField() # obj.name
  3. pwd = serializers.CharField() # obj.pwd
  4. group_id = serializers.CharField() # obj.group_id
  5. xxxx = serializers.CharField(source="group.title") # obj.group.title
  6. x1 = serializers.CharField(source="group.mu.name") # obj.mu.name
  7. # x2 = serializers.CharField(source="roles.all") # obj.mu.name
  8. # x2 = serializers.ListField(child=MyCharField(),source="roles.all") # obj.mu.name
  9. x2 = serializers.SerializerMethodField()
  10.  
  11. def get_x2(self,obj): #get_字段名
  12. print(obj) ##UserInfo object
  13. obj.roles.all()
  14. role_list = obj.roles.filter(id__gt=1)
  15. data_list = []
  16. for row in role_list:
  17. data_list.append({'pk':row.pk,'name':row.name})
  18. return data_list

Views.py

基于models

  1. class UsersSerializer(serializers.ModelSerializer):
  2. x1 = serializers.CharField(source='name')
  3. group = serializers.HyperlinkedIdentityField(view_name='detail')
  4. class Meta:
  5.  
  6. model = models.UserInfo
  7. # fields = "__all__"
  8. fields = ['name','pwd','group','x1'] #自定义字段的时候注意要指定source,scource里面的数据必须是数据库有的数据
  9. depth = 1 #表示深度
  10.  
  11. class UsersView(APIView):
  12. def get(self,request,*args,**kwargs):
  13. self.dispatch
  14. # 方式一:
  15. # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title")
  16. # return Response(user_list)
  17.  
  18. # 方式二之多对象
  19. user_list = models.UserInfo.objects.all()
  20. # [obj1,obj2,obj3]
  21. ser = UsersSerializer(instance=user_list,many=True)
  22. return Response(ser.data)

Views.py

生成url

  1. class UsersSerializer(serializers.ModelSerializer): #
  2. group = serializers.HyperlinkedIdentityField(view_name='detail')
  3. class Meta:
  4. model = models.UserInfo
  5. fields = "__all__"
  6. fields = ['name', 'pwd','group']
  7. depth = 1
  8.  
  9. class UsersView(APIView):
  10. def get(self,request,*args,**kwargs):
  11. self.dispatch
  12. # 方式一:
  13. # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title")
  14. # return Response(user_list)
  15.  
  16. # 方式二之多对象
  17. user_list = models.UserInfo.objects.all()
  18. # [obj1,obj2,obj3]
  19. ser = UsersSerializer(instance=user_list,many=True,context={'request':request})
  20. return Response(ser.data)

views.py

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3. from app03 import views
  4. urlpatterns = [
  5.  
  6. url(r'^users4/', views.UserView4.as_view(), name='xxx'), #吧users4的group的值反向生成users5的url
  7. url(r'^users5/(?P<pk>.*)', views.UserView5.as_view(), name='detail'), #必须叫pk
  8. # url(r'^users4/(?P<pk>.*)', views.UserView4.as_view(), name='detail'),
  9. ]

urls.py

全局生成url

  1. class UsersSerializer(serializers.HyperlinkedModelSerializer): #继承他自动生成
  2. class Meta:
  3. model = models.UserInfo
  4. fields = "__all__"
  5.  
  6. # fields = ['id','name','pwd']
  7.  
  8. class UsersView(APIView):
  9. def get(self,request,*args,**kwargs):
  10. self.dispatch
  11. # 方式一:
  12. # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title")
  13. # return Response(user_list)
  14.  
  15. # 方式二之多对象
  16. user_list = models.UserInfo.objects.all()
  17. # [obj1,obj2,obj3]
  18. ser = UsersSerializer(instance=user_list,many=True,context={'request':request})
  19. return Response(ser.data)

views.py

数据验证

自定义

  1. class PasswordValidator(object):
  2. def __init__(self, base):
  3. self.base = base
  4.  
  5. def __call__(self, value):
  6. if value != self.base:
  7. message = '用户输入的值必须是 %s.' % self.base
  8. raise serializers.ValidationError(message)
  9.  
  10. def set_context(self, serializer_field):
  11. """
  12. This hook is called by the serializer instance,
  13. prior to the validation call being made.
  14. """
  15. # 执行验证之前调用,serializer_fields是当前字段对象
  16. pass
  17.  
  18. class UsersSerializer(serializers.Serializer):
  19. name = serializers.CharField(min_length=6)
  20. pwd = serializers.CharField(error_messages={'required': '密码不能为空'}, validators=[PasswordValidator('')])

views.py

基于models

  1. class PasswordValidator(object):
  2. def __init__(self, base):
  3. self.base = base
  4.  
  5. def __call__(self, value):
  6. if value != self.base:
  7. message = '用户输入的值必须是 %s.' % self.base
  8. raise serializers.ValidationError(message)
  9.  
  10. def set_context(self, serializer_field):
  11. """
  12. This hook is called by the serializer instance,
  13. prior to the validation call being made.
  14. """
  15. # 执行验证之前调用,serializer_fields是当前字段对象
  16. pass
  17.  
  18. class UsersSerializer(serializers.ModelSerializer):
  19. class Meta:
  20. model = models.UserInfo
  21. fields = "__all__"
  22. #自定义验证规则
  23. extra_kwargs = {
  24. 'name': {'min_length': 6},
  25. 'pwd': {'validators': [PasswordValidator(666), ]}
  26. }

views.py

使用

  1. class UsersView(APIView):
  2. def get(self,request,*args,**kwargs):
  3. self.dispatch
  4. # 方式一:
  5. # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title")
  6. # return Response(user_list)
  7.  
  8. # 方式二之多对象
  9. user_list = models.UserInfo.objects.all()
  10. # [obj1,obj2,obj3]
  11. ser = UsersSerializer(instance=user_list,many=True,context={'request':request})
  12. return Response(ser.data)
  13.  
  14. def post(self,request,*args,**kwargs):
  15. ser = UsersSerializer(data=request.data)
  16. if ser.is_valid():
  17. print(ser.validated_data)
  18. else:
  19. print(ser.errors)
  20. return Response('...')

views.py

钩子函数

  1. def validate_字段(self,validated_value):
  2. raise ValidationError(detail='xxxxxx')
  3. return validated_value

参考or转发

http://www.cnblogs.com/haiyan123/p/8427997.html#lable3

Django_rest_framework_Serializer的更多相关文章

随机推荐

  1. CentOS7.2安装mysql

    1. 下载Mysql yum包 http://dev.mysql.com/downloads/repo/yum/ 复制链接使用wget下载 wget http://repo.mysql.com/mys ...

  2. 垂直方向兼容显示的内容多少的情况样式Flex布局

    使用flex弹性布局,无论里面的元素显示几个,都会居中显示,父元素设置成如下样式 display: flex; flex-direction: column; justify-content: cen ...

  3. iptables传输数据包的过程

    IPTABLES传输数据包的过程 大概过程如图所示: 1. 数据包进入网卡时,首先进入PREROUTING链,linux内核会判断数据包的目的IP是否为本地主机 2. 如果数据包的目的IP是本地主机, ...

  4. ORA-28000 账号被锁定的解决办法

    ORA-28000 账号被锁定的解决办法 错误场景:当使用sqlplus进行登录时报错:ORA-28000 账号被锁定.错误原因:由于oracle 11g 在默认在default概要文件中设置了密码最 ...

  5. 什么是控制反转(IOC)?什么是依赖注入?

    控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的.在传统编程方式中,业务逻辑的流程是应用程序中早已被设定好关联关系的对象来决定的 ...

  6. zabbix服务快速搭建指南

    zabbix监控服务快速安装指南 1.更换centos7-base源为阿里源  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.ali ...

  7. Web安全0001 - MySQL SQL注入 - 如何寻找注入点

    注:本文是学习网易Web安全进阶课的笔记,特此声明. 其他数据库也可以参考寻找注入点. A: 一.信息搜集(百度) 1.无特定目标 inurl:.php?id= 2.有特定目标 inurl:.php? ...

  8. IceStorm示例运行步骤

    又一次忘了,记下: 1.启动IceStorm服务,输入:icebox --Ice.Config=config.icebox 启动IceStorm服务.2.消息接收:开启另一个命令行窗口,Subscri ...

  9. Android远程擦除漏洞

    漏洞原理: 安卓浏览器内核有这样一个机制,当网页内嵌入了一个特定格式的字符串,就可以被识别为一个电话号码通过点击该字符串的方式拨打电话.但是没有对*#06#等具有特殊功能的拨号组合进行限制,由于很多厂 ...

  10. 20155222卢梓杰 课堂测试ch06补做

    20155222卢梓杰 课堂测试ch06补做 1.下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为() A . 1 B . 1/4 C . 1/2 D . 3/4 正确答案 ...