目录
一、简介
二、使用
1.基本使用
2.自定义序列化字段
3.连表序列化以及深度控制
4.序列化字段url
一、简介
django rest framework 中的序列化组件,可以说是其核心组件,也是我们平时使用最多的组件,它不仅仅有序列化功能,更提供了数据验证的功能(与django中的form类似)。

便于展现的序列化操作,我们需要在model添加外键、多对多情况。以下是新的models(请删除原有的数据库,重新migrate):
models.py
from django.db import models

class UserInfo(models.Model):
user_type_choice = (
(1,”普通用户”),
(2,”会员”),
)
user_type = models.IntegerField(choices=user_type_choice)
username = models.CharField(max_length=32,unique=True)
password = models.CharField(max_length=64)
group = models.ForeignKey(to=’UserGroup’,null=True,blank=True)
roles = models.ManyToManyField(to=’Role’)

class UserToken(models.Model):
user = models.OneToOneField(to=UserInfo)
token = models.CharField(max_length=64)

class UserGroup(models.Model):
“””用户组”””
name = models.CharField(max_length=32,unique=True)

class Role(models.Model):
“””角色”””
name = models.CharField(max_length=32,unique=True)
二、使用
1.基本使用
在urls.py中添加新的角色url,以前的url为了减少干扰,在这里进行注释:
from django.conf.urls import url
from app01 import views

urlpatterns = [

  1. # url(r'^api/v1/auth', views.AuthView.as_view()),# url(r'^api/v1/order', views.OrderView.as_view()),
  2. url(r'^api/v1/roles', views.RoleView.as_view()), # 角色视图
  3. # url(r'^api/(?P<version>[v1|v2]+)/user', views.UserView.as_view(),name="user_view"),

]
views.py
from rest_framework import serializers
from rest_framework.views import APIView
from django.shortcuts import HttpResponse
from app01 import models
import json

class RolesSerializer(serializers.Serializer): #定义序列化类
id=serializers.IntegerField() #定义需要提取的序列化字段,名称和model中定义的字段相同
name=serializers.CharField()
class RoleView(APIView):
“””角色”””
def get(self,request,args,*kwargs):
roles=models.Role.objects.all()
res=RolesSerializer(instance=roles,many=True) #instance接受queryset对象或者单个model对象,当有多条数据时候,使用many=True,单个对象many=Falsereturn HttpResponse(json.dumps(res.data,ensure_ascii=False))
使用浏览器访问http://127.0.0.1:8000/api/v1/roles ,结果如下:

2.自定义序列化字段
当数据模型中有外键或者多对多时候,这时候就需要自定义序列化了
新增用户信息url
from django.conf.urls import url
from app01 import views

urlpatterns = [

  1. # url(r'^api/v1/auth', views.AuthView.as_view()),# url(r'^api/v1/order', views.OrderView.as_view()),
  2. url(r'^api/v1/roles', views.RoleView.as_view()),
  3. url(r'^api/v1/userinfo', views.UserinfoView.as_view()), #用户信息
  4. # url(r'^api/(?P<version>[v1|v2]+)/user', views.UserView.as_view(),name="user_view"),

]
UserinfoView和序列化类
class UserinfoSerializer(serializers.ModelSerializer):
id = serializers.IntegerField() # 定义需要提取的序列化字段,名称和model中定义的字段相同
username=serializers.CharField()
password=serializers.CharField()

  1. #sss=serializers.CharField(source='user_type') #该方法只能拿到user_type的ID
  2. sss=serializers.CharField(source='get_user_type_display') #自定义字段名称,和数据模型不一致,需要指定source本质调用get_user_type_display()方法获取数据
  3. #rl=serializers.CharField(source='roles.all.first.name')
  4. gp=serializers.CharField(source='group.name')
  5. rl=serializers.SerializerMethodField() #多对多序列化方法一
  6. def get_rl(self,obj): #名称固定:get_定义的字段名称
  7. """
  8. 自定义序列化
  9. :param obj:传递的model对象,这里已经封装好的
  10. :return:
  11. """
  12. roles=obj.roles.all().values() #获取所有的角色
  13. return list(roles) #返回的结果一定有道是json可序列化的对象
  14. class Meta:
  15. model = models.UserInfo
  16. fields = ['id', 'username', 'password', 'sss','rl','gp'] #配置要序列化的字段
  17. # fields = "__all__" 使用model中所有的字段

class UserinfoView(APIView):
“””用户信息”””
def get(self,request,args,*kwargs):
users=models.UserInfo.objects.all()
res=UserinfoSerializer(instance=users,many=True) #instance接受queryset对象或者单个model对象,当有多条数据时候,使用many=True,单个对象many=False
return HttpResponse(json.dumps(res.data,ensure_ascii=False))

更多相关文章

  1. 小鸟云服务器FTP上传中断是什么原因?解决方法总结
  2. 使用伸缩盒标签制作一个首页的二级分类
  3. 纯静态文件打包部署预览链接,来自于vue的cli官方文件,使用的是yarn
  4. 使用css浮动完成网页顶部导航
  5. 弹性盒flex的使用
  6. ROS2中使用Gtes示例
  7. table和form的使用
  8. 万能码互赢互利(安全扫码专业委员会)
  9. mindmanager2022破解版_mindmanager破解版[自带注册机可生成激活

随机推荐

  1. 如何通过多次单击在画布上显示多个箭头
  2. 关于 客户端发现响应内容类型为“text/ht
  3. 【麦子学院】03.web前端开发之html5本地
  4. HTML的CHECKBOX后面的文字点击同时选中
  5. 限制HTML输入,只允许粘贴
  6. 调整另一个div的div onclick,过渡效果
  7. 如何在HTML主体上设置网格ExtJS,高度为100
  8. 2003生成 注释web页问题,第二级的html 内
  9. 制作一个可滚动的div,它不会滚动身体的其
  10. 使用换行符将textarea的文本复制到div中