序列化
方式一 :在业务类里序列化数据库数据

  1. class RolesView(APIView):
  2. def get(self,request,*args,**kwargs):
  3. roles = models.Role.objects.all().values('id','title')[1:3]
  4. ret = list(roles)
  5. r = json.dumps(ret,ensure_ascii=False)
  6. return HttpResponse(r)

方式二:写个序列化的类,在业务类中引用,序列化类中可以定制字段

  1. class UserinfoSerializer(serializers.ModelSerializer):
  2. #字段名与数据库相同则替换,不同则添加
  3. type = serializers.CharField(source='get_usertype_display')
  4. gb = serializers.CharField(source='group.title')
  5. class Meta:
  6. model = models.UserInfo
  7. #全部显示
  8. fields = '__all__'
  9. #定制显示
  10. # fields = ['id','username','type','gb']

定制类

  1. class UserInfo(models.Model):
  2. usertype_choices = (
  3. (1,'普通用户'),
  4. (2,'VIP用户'),
  5. (3,'SVIP用户')
  6. )
  7. usertype = models.IntegerField(choices=usertype_choices,verbose_name='用户类型')
  8. username = models.CharField(max_length=32,unique=True,verbose_name='用户名')
  9. password = models.CharField(max_length=64,verbose_name='密码')
  10. group = models.ForeignKey('UserGroup',on_delete=models.DO_NOTHING,verbose_name='分组')
  11. roles = models.ManyToManyField('Role',verbose_name='职业')
  12. class Meta:
  13. verbose_name = '用户管理'
  14. verbose_name_plural = verbose_name
  15.  
  16. def __str__(self):
  17. return self.username

对应数据库结构

  1. class UserInfoView(APIView):
  2. authentication_classes = []
  3. permission_classes = []
  4. def get(self,request,*args,**kwargs):
  5. m = models.UserInfo.objects.all()
  6. ser = UserinfoSerializer(instance=m,many=True)
  7. #单表的话这里many = false
  8. return Response(ser.data)

业务类

方式二补充:source不适合many to many,many to many需要自定义显示

  1. role = serializers.SerializerMethodField() #自定义显示
  2. def get_role(self,row):
  3. role_list = row.roles.all()
  4. ret = []
  5. for item in role_list:
  6. ret.append({'id':item.id,'title':item.title})
  7. return ret

many to many

方式三:depth根本连表结构往深层取值

  1. class UserinfoSerializer(serializers.ModelSerializer):
  2. usertype = serializers.CharField(source='get_usertype_display')
  3. class Meta:
  4. model = models.UserInfo
  5. #全部显示
  6. fields = '__all__'
  7. depth = 1 #0~10之间
  8. #定制显示
  9. # fields = ['id','username','type','gb']

定制类

  1. [{"id": 1, "usertype": 1, "username": "wrx", "password": "", "group": {"id": 1, "title": "A组"}, "roles": [{"id": 2, "title": "老师"}, {"id": 3, "title": "医生"}]},
  2. {"id": 2, "usertype": 2, "username": "ylp", "password": "", "group": {"id": 2, "title": "B组"}, "roles": [{"id": 3, "title": "医生"}]}]

取值结果

方式四:生成链接,即把上述类的group生成链接

  1. class UserinfoSerializer(serializers.ModelSerializer):
  2. usertype = serializers.CharField(source='get_usertype_display')
  3. group = serializers.HyperlinkedIdentityField(view_name='grp',lookup_field='group_id',lookup_url_kwarg='pk')
  4. #name,pk值对应urls中的re-path
  5. class Meta:
  6. model = models.UserInfo
  7. #全部显示
  8. fields = '__all__'
  9. depth = 1 #0~10之间
  10. #定制显示
  11. # fields = ['id','username','type','gb']

定制类

  1. re_path(r'^(?P<version>[v1|v2]+)/group/(?P<pk>\d+)$',GroupView.as_view(),name='grp')
    PS:这里经历了一个错误,如果配置了全局的版本控制(详见版本控制配置),这里要也要配置,否则会一直报错
    django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "grp". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.
  1. class UserInfoView(APIView):
  2. def get(self,request,*args,**kwargs):
  3. m = models.UserInfo.objects.all()
  4. ser = UserinfoSerializer(instance=m,many=True,context={'request':request})
  5. return Response(ser.data)

Views业务类

PS:实例这个定制类的时候要加要加context={'request':request}

实际调用的是另一个views类的url

  1. class GroupSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = models.UserGroup
  4. fields = '__all__'
  5.  
  6. class GroupView(APIView):
  7. def get(self,request,*args,**kwargs):
  8. pk = kwargs.get('pk')
  9. obj = models.UserGroup.objects.filter(pk=pk).first()
  10. ser = GroupSerializer(instance=obj, many=False)
  11. t = json.dumps(ser.data, ensure_ascii=False)
  12. return HttpResponse(t)

上面re_path对应的定制类和业务类

方式五:三张表互相关联的反向查找

  1. class Course(models.Model):
  2. title = models.CharField(max_length=32,verbose_name='课程名称')
  3. course_img = models.ImageField(verbose_name='课程图片',upload_to = "static/img/")
  4. course_choice = (
  5. (0, '入门级'),
  6. (1, '普通难度'),
  7. (2, '中等难度'),
  8. (3, '高级难度'),
  9. )
  10. level = models.IntegerField(verbose_name='课程难度',choices=course_choice,default=0)
  11.  
  12. class Meta:
  13. verbose_name = '课程管理'
  14. verbose_name_plural = verbose_name
  15.  
  16. def __str__(self):
  17. return self.title
  18.  
  19. class CourseInfo(models.Model):
  20. why = models.CharField(verbose_name='课程描述',max_length=255)
  21. course = models.OneToOneField(to='Course',on_delete=models.DO_NOTHING,verbose_name='关联课程')
  22. recommend_course = models.ManyToManyField(to='Course',verbose_name='推荐课程',related_name='rc')
  23.  
  24. class Meta:
  25. verbose_name = '课程详细'
  26. verbose_name_plural = verbose_name
  27.  
  28. def __str__(self):
  29. return '课程详细:'+self.course.title
  30.  
  31. class Section(models.Model):
  32. num = models.IntegerField(verbose_name='章节')
  33. name = models.CharField(max_length=64,verbose_name='课程章节')
  34. course = models.ForeignKey(to='Course', on_delete=models.DO_NOTHING, verbose_name='关联课程')
  35.  
  36. class Meta:
  37. verbose_name = '课程章节'
  38. verbose_name_plural = verbose_name
  39.  
  40. def __str__(self):
  41. return '课程章节'+self.course.title

表结构

PS:第二张表与第一张表多对多并且单对单(这里有个小知识点,同时多对多和单对单的时候有一张表要加related_name='rc'),第三张表与第一张表一对多,需求:通过序列化第二张表得到第一张表和第三张表的相关内容

  1. class CourseinfoSerializer(serializers.ModelSerializer):
  2. #单对单,单对多,choice可以用这种方式,多对多不能使用
  3. title = serializers.CharField(source='course.title')
  4. level = serializers.CharField(source='course.get_level_display')
  5. #多对多需要自定义
  6. recommends = serializers.SerializerMethodField()
  7. def get_recommends(self, row):
  8. role_list = row.recommend_course.all()
  9. ret = []
  10. for item in role_list:
  11. ret.append({'id': item.id, 'title': item.title})
  12. return ret
  13. #3张表互相关联的反向查找
  14. sections = serializers.SerializerMethodField()
  15. def get_sections(self, row):
  16. role_list = row.course.section_set.all()
  17. ret = []
  18. for item in role_list:
  19. ret.append({'num': item.num, 'name': item.name})
  20. return ret
  21. class Meta:
  22. model = models.CourseInfo
  23. # fields = '__all__'
  24. fields = ['id','title','level','why','recommends','sections']
  25. # depth = 2

定制类

  1. def retrieve(self,request, *args, **kwargs):
  2. ret = {'code': 1000, 'data': None}
  3. pk = kwargs.get('pk')
  4. try:
  5. obj = models.CourseInfo.objects.filter(course_id=pk)
  6. ser = sl.CourseinfoSerializer(instance=obj, many=True)
  7. ret['data'] = ser.data
  8. except Exception as e:
  9. ret['code'] = 1001
  10. ret['error'] = '获取课程失败'
  11. return Response(ret)

业务类

PS:这实际是个类的get请求,re_path(r'^course/(?P<pk>\d+)$',views.CourseView.as_view({'get':'retrieve'})),

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

序列化-数据验证,验证title数据不能为空且必须以wrx开头

  1. class UserGroupSerializer(serializers.Serializer):
  2. title = serializers.CharField(error_messages={'required':'标题不能为空'},)
  3. def validate_title(self,value):
  4. if not value.startswith('wrx'):
  5. message = '标题必须以%s开头'%'wrx'
  6. raise exceptions.ValidationError(message)
  7. else:
  8. return value

定制类

  1. class UserGroupView(APIView):
  2. def post(self,request,*args,**kwargs):
  3. src = ''
  4. res = UserGroupSerializer(data=request.data)
  5. if res.is_valid():
  6. print(res.validated_data)
  7. src = str(res.validated_data['title'])
  8. else:
  9. print(res.errors)
  10. src = str(res.errors)
  11. return HttpResponse(src)

业务类

「Django」rest_framework学习系列-序列化的更多相关文章

  1. 「Django」rest_framework学习系列-分页

    分页a.分页,看第N页,每页显示N条数据方式一:使用PageNumberPagination创建分页对象,配合settings全局配置 views设置 from rest_framework.pagi ...

  2. 「Django」rest_framework学习系列-视图

    方式一 1.settings设置 INSTALLED_APPS = [ ... 'rest_framework', ] 2.views设置 from rest_framework.response i ...

  3. 「Django」rest_framework学习系列-API访问跨域问题

    #以中间件方式解决API数据访问跨域问题1.API下新建文件夹下写PY文件a.引入内置类继承: from django.middleware.common import MiddlewareMixin ...

  4. 「Django」rest_framework学习系列-路由

    自动生成4个url路由:from rest_framework import routersrouter = routers.DefaultRouter()router.register(r'wrx' ...

  5. 「Django」rest_framework学习系列-渲染器

    渲染器:作用于页面,JSONRenderer只是JSON格式,BrowsableAPIRenderer有页面,.AdminRenderer页面以admin形式呈现(需要在请求地址后缀添加?fromat ...

  6. 「Django」rest_framework学习系列-解析器

    满足两个要求,request.Post中才有值 1.请求头要求:请求头中的Content-Type为application/x-www-form-urlencoded 2.数据格式要求 name=x& ...

  7. 「Django」rest_framework学习系列-版本认证

    1.自己写: class UserView(APIView): versioning_class = ParamVersion def get(self,request,*args,**kwargs) ...

  8. 「Django」rest_framework学习系列-权限认证

    权限认证:1.项目下utils文件写permissions.py文件 from rest_framework.permissions import BasePermission class SVIPP ...

  9. 「Django」rest_framework学习系列-节流控制

    1.节流自定义类: import time from api import models VISIT_RECORD = {} class VisitThrottle(BaseThrottle): #设 ...

随机推荐

  1. Variable() placeholder() constant() 的区别

    转载来自: http://www.studyai.com/article/33e22cef42274e8a

  2. content-length与Transfer-Encoding: chunked的问题释疑

    http返回头中content-length与Transfer-Encoding: chunked的问题释疑 先说说问题出现的背景: 公司服务器与手机客户端交互,客户端请求一个动态生成的XML文件,在 ...

  3. Java线上应用故障排查之一:高CPU占用 (转)

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...

  4. LeetCode 206. Reverse Linked List(C++)

    题目: Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4 ...

  5. 2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 第9章 排序与查找 9.1查找 查找是这样一个过程,即在某个项目组中寻找某一指定目标元 ...

  6. 软工1816 · Alpha冲刺(6/10)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 alpha冲刺时间延后一周,重新规划任务安排 完成食堂店铺经纬度标注,以供美食 ...

  7. 福大软工1816:Beta(3/7)

    Beta 冲刺 (3/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 参与开发关键词提醒部分 展示GitHu ...

  8. HDU 5172 GTY's gay friends 线段树+前缀和+全排列

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172 bc(中文):http://bestcoder.hdu.edu.cn/contest ...

  9. C语言调查问卷

    1.你对自己的未来有什么规划?做了哪些准备?毕业后应该不会从事编程类工作,目前有在学习感兴趣的东西.2.你认为什么是学习?学习有什么用?现在学习动力如何?为什么?学习就是把不懂变成懂,可以充实自己.没 ...

  10. Java中的网络编程-2

    Socket编程:(一般的网络编程) <1> 两个 JAVA 应用程序可通过一个双向的网络通信连接, 实现数据交换, 这个双向链路的一段称为一个 Socket. <2> Soc ...