Django rest framework 序列化组件
在笔者认为,在Django rest framework中最重要的是序列化组件,通过序列化我们可以将我们后台数据通过一定格式发送到我们的前端,然后通过一定的方法展示我们的数据。
那么我们就开始介绍我们的序列化组件吧!
自定义字段
url部分:
from django.conf.urls import url, include
from web.views.s6_serializers import TestViewurlpatterns = [url(r'test/', TestView.as_view(), name='test'),
]urls.py
视图部分:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from .. import modelsclass PasswordValidator(object):def __init__(self, base):self.base = basedef __call__(self, value):if value != self.base:message = 'This field must be %s.' % self.baseraise serializers.ValidationError(message)def set_context(self, serializer_field):"""This hook is called by the serializer instance,prior to the validation call being made."""# 执行验证之前调用,serializer_fields是当前字段对象passclass UserSerializer(serializers.Serializer):ut_title = serializers.CharField(source='ut.title')user = serializers.CharField(min_length=6)pwd = serializers.CharField(error_messages={'required': '密码不能为空'}, validators=[PasswordValidator('666')])class TestView(APIView):def get(self, request, *args, **kwargs):# 序列化,将数据库查询字段序列化为字典data_list = models.UserInfo.objects.all()ser = UserSerializer(instance=data_list, many=True)# 或# obj = models.UserInfo.objects.all().first()# ser = UserSerializer(instance=obj, many=False)return Response(ser.data)def post(self, request, *args, **kwargs):# 验证,对请求发来的数据进行验证ser = UserSerializer(data=request.data)if ser.is_valid():print(ser.validated_data)else:print(ser.errors)return Response('POST请求,响应内容')views.py
基本用法:
from rest_framework import serializersclass RolesSerializer(serializers.Serializer):id = serializers.IntegerField() #显示的顺序和这里的顺序有关title = serializers.CharField() #我们需要的字段class RolesView(APIView):def get(self,request,*args,**kwargs):#方式一# roles = models.Role.objects.all().values('id','title')# roles = list(roles)# ret = json.dumps(roles,ensure_ascii=False)#序列化,改成False则显示中文,不帮中文编码#方式二 对于querryset [obj,obj,obj]# roles = models.Role.objects.all()# ser = RolesSerializer(instance=roles,many=True)#有多条数据 many=True# # print(ser.data)#是一个有序的字典# ret = json.dumps(ser.data, ensure_ascii=False)role = models.Role.objects.all().first()ser = RolesSerializer(instance=role, many=False) # 针对单个数据# print(ser.data)#是一个有序的字典ret = json.dumps(ser.data, ensure_ascii=False)return HttpResponse(ret)
各种字段连接关系的使用:
class UserInfoSerializer(serializers.Serializer): #类名和我们的orm没有硬性关系,但是最好是按照数据库的来这样能分清user_type1 = serializers.CharField(source="user_type")user_type2 = serializers.CharField(source="get_user_type_display")username = serializers.CharField()password = serializers.CharField()gp = serializers.CharField(source='group.title') #通过.的方式去连外键# like = serializers.CharField(source='roles.all ') 多对多的时候不能用这种方式,显示不出来#--------------------------------------------#rls = serializers.SerializerMethodField() #多对多使用def get_rls(self,row):role_obj_list = row.roles.all() #字段名ret=[]for item in role_obj_list:ret.append({'id':item.id,'title':item.title})return retclass UserInfoSerializer(serializers.ModelSerializer): #ModelSerializer相比上面的类更简洁user_type2 = serializers.CharField(source="get_user_type_display") #实现自连,为什么实现rls = serializers.SerializerMethodField()class Meta:model = models.UserInfofields = ['id','username','password','user_type2','rls']def get_rls(self, row): #自定义显示role_obj_list = row.roles.all() #字段名ret=[]for item in role_obj_list:ret.append({'id':item.id,'title':item.title})return ret
深度控制以及反向生成URL
urls.py
urlpatterns = [re_path(r'^(?P<version>[v1|v2]+)/userinfo/$', views.UserInfoView .as_view(),),re_path(r'^(?P<version>[v1|v2]+)/group/(?P<pk>\d+)$', views.GroupView .as_view(),name='gp'),re_path(r'^(?P<version>[v1|v2]+)/group/(?P<pk>\d+)$', views.GroupView .as_view(),name='gp'),
]
views.py
class UserInfoSerializer(serializers.ModelSerializer):group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='pk')class Meta:model = models.UserInfofields = ['id','username','password','group','roles'] #fields是固定的变量,不能自定义depth = 0 #深度控制 感觉是向后.一个单位,class UserInfoView(APIView):def get(self,request,*args,**kwargs):users = models.UserInfo.objects.all()ser = UserInfoSerializer(instance=users,many=True,context={'request':request})ret = json.dumps(ser.data,ensure_ascii=False) #防止出现乱码,在序列化的时候添加这个return HttpResponse(ret)class GroupSerializer(serializers.ModelSerializer):# group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='xxx')class Meta:model = models.UserGroupfields = '__all__'# fields = ['id','username','password','group','roles'] #fields是固定的变量,不能自定义depth = 0 #深度控制 感觉是向后.一个单位,class GroupView(APIView):def get(self,request,*args,**kwargs):pk = kwargs.get('pk')obj = models.UserGroup.objects.filter(pk=pk).first()ser = GroupSerializer(instance=obj,many=False)ret = json.dumps(ser.data,ensure_ascii=False)return HttpResponse(ret)
序列化验证系列
源码流程
转载于:https://www.cnblogs.com/swearBM/p/10458797.html
Django rest framework 序列化组件相关推荐
- Django REST framework 序列化与请求响应
Django REST framework 序列化与请求响应 文章目录 Django REST framework 序列化与请求响应 @[toc] 1. INSTALLED_APPS注册rest_fr ...
- Django REST framework 序列化
创建一个序列化类 使用序列化有四种方式 使用json模块,完全手写 使用django自带的序列化模块 1,# from django.core import serializers 2,# dat ...
- Django框架restful序列化组件get/post请求接口设计
闲话不聊.... 直接上数据库模型代码models.py内容 class Author(models.Model):nid = models.AutoField(primary_key=True)na ...
- Django框架(十九)—— drf:序列化组件(serializer)
序列化组件 # 模型层 from django.db import modelsclass Book(models.Model): nid = models.AutoField(primary_key ...
- 谈谈Django REST Framework(DRF)中的序列化器
摘要 Django REST Framework(DRF)是一个强大的工具,可以帮助我们构建和处理RESTful API.其中的序列化器(Serializers)是其核心组件之一,它允许我们快速有效地 ...
- Django REST framework API 指南(12):验证器
官方原文链接 本系列文章 github 地址 转载请注明出处 验证器 大多数情况下,您在 REST framework 中处理验证时,只需依赖默认的字段验证,或者在序列化类或字段类上编写明确的验证方法 ...
- Django REST framework学习笔记
文章目录 1. API接口开发 1.1 获取数据的接口 1.2 添加数据的接口 1.3 更新数据的接口 1.4 删除数据的接口 2. API字段的定制 2.1 别名字段 2.2 字段格式化 2.3 字 ...
- 在django restful framework中设置django model的property
众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...
- Rest Framework:二、序列化组件
一.序列化组件 环境配置: 使django支持Mysql(前面已有介绍,这里不再重复) 使django支持 framework 在settings.py中的INSTALLED_APPS字段添加: &q ...
最新文章
- mysql免安装教程
- android 常驻进程
- 7z001怎么解压在安卓手机上面_安卓手机能打开eif文件吗 手机怎么打开eip文件方法...
- RxSwift之常用高阶函数(操作符Operator)的说明和使用
- 等级滤波器(泛化的腐蚀、膨胀和中值滤波)
- 神经网络的激活函数、并通过python实现激活函数
- 工作变得简单又高效 试试这八个WebApp
- html5触摸指定区域,HTML5/CSS3系列教程:HTML5 区域(Sectioning)的重要性
- python3.9新特性_Python 3.9正式版,新特性提前一睹为快
- 为何提示网站安全证书有问题?不同原因下,如何解决?
- python中rand和randn_Numpy中np.random.rand()和np.random.randn() 用法和区别详解
- java日期与时间戳相互转换大全
- K8S探索之Service+Flannel本机及跨主机网络访问原理详解
- 复数,通往真理的最短路径
- 如何预防猪流感!猪流感!?会像SARS那样爆发吗?我们能作的就是预防。
- python的扩展控制鼠标
- 《一步一步使用ABP框架搭建正式项目系列教程》
- mysql创建数据库整数五种整形_mysql 整型数据类型
- Quartus II 13.1(Linux版本)安装
- 【BZOJ】4543: [POI2014]Hotel加强版-长链剖分DP
热门文章
- html导航怎么跟着往下滚动,javascript,html_导航要跟着鼠标滚动向下滚动,用了jquery插件但是报错,请问大牛是什么原因?,javascript,html - phpStudy...
- java 获取 t 的类型_如何获取类型为T的字段的类?
- java 父子级json组装不用递归_初级Java程序员如何进阶
- 操作系统—基本地址变换机构
- ALOHA simulaiton仿真结果及分析
- token详解及常见防范措施
- bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈)
- HDU 5943 2016CCPC杭州 K: Kingdom of Obsession(二分匹配)
- python机器学习库sklearn——神经网络
- OPNET网络仿真分析-1.1.1、网络仿真简介