目录

一 什么是序列化

二 Django REST framework配置流程之Serializer

三 Django REST framework配置流程之ModelSerializer

一 什么是序列化

序列化模型与序列化关系模型

序列化模型,顾名思义,即对 models 里的数据模型作序列化。

而序列化关系模型则是对 models 里数据模型中带有关系的如 ForeignKey, ManyToManyField 和 OneToOneField 字段作序列化。

Django Rest Framework 提供了灵活的序列化关系模型,让开发者可以自由定制序列化数据模型。

二 Django REST framework配置流程之Serializer

1、GET请求

  1. 写一个序列化的类,这个类需要继承Serializer,一对多字段可以直接通过指定source字段来查找。如果是多对多的字段则需要做进一步处理才能在页面显示
from rest_framework import serializers
class UserInfoSerializer(serializers.Serializer):
name = serializers.CharField(max_length=32)
pwd = serializers.CharField(max_length=128)
# 多对多跨表查询,查询到的是所有对象
been_city = serializers.CharField(source="been_city.all")
  1. 视图函数的配置
class IndexView(APIView):

    def get(self, request):
user_list = models.UserInfo.objects.all()
# 获取到的是一个serializer对象,如果user_list是一个对象则不需要many=True
ser = UserInfoSe rializer(instance=user_list, many=True)
# print(ser)
"""
UserInfoSerializer(instance=<QuerySet []>, many=True):
name = CharField(max_length=32)
pwd = CharField(max_length=128)
been_city = CharField(source='city.name')
"""
# ser.data是一个有序字典
return Response(ser.data)
  1. 启动项目访问url,可以看到多对多字段只能显示object

  2. 处理多对多字段的显示

    a) 方法一:重写CharField的to_representation方法,这个方法就是用来显示最终数据的

class MyCharField(serializers.CharField):
def to_representation(self, value):
# value就是QuerySet对象列表
data_list = []
for row in value:
data_list.append({'name': row.name, 'province': row.province.name})
return data_list class UserInfoSerializer(serializers.Serializer):
name = serializers.CharField(max_length=32)
pwd = serializers.CharField(max_length=128)
# 通过自定义的MyCharField中的to_representation处理多对多字段的QuerySet对象
been_city = MyCharField(source="been_city.all")

 b) 方法二:通过ListField方法

class MyCharField(serializers.CharField):
def to_representation(self, value):
# value就是每个QuerySet对象 return {‘id’:value.pk, "name": value.name, "province":value.province.name} class UserInfoSerializer(serializers.Serializer):
name = serializers.CharField(max_length=32)
pwd = serializers.CharField(max_length=128)
# 通过自定义的MyCharField中的to_representation处理多对多字段的QuerySet对象
been_city = serializers.ListField(child=MyCharField(),source="been_city.all")

 c) 方法三:通过定义serializers.SerializerMethodField()可以生成对象列表,然后通过get方法,可以接收对象,并返回需要的json数据

class UserInfoSerializer(serializers.Serializer):
name = serializers.CharField(max_length=32)
pwd = serializers.CharField(max_length=128)
# 多对多跨表查询,查询到的是所有city对象
# been_city = serializers.CharField(source="been_city.all")
# print(been_city)
# provinse = serializers.CharField(source="been_city.province")
been_city = serializers.SerializerMethodField() # 获取到的是UserInfo对象 def get_been_city(self, obj):
print(obj)
city_list = obj.been_city.all()
data_list = []
for row in city_list:
data_list.append({'name': row.name, 'province': row.province.name})
return data_list

源码浏览

访问URL效果

2、POST请求

  1. 数据验证配置
class PasswordValidator(object):
def __init__(self, base):
self.base = base
def __call__(self, value):
if value != self.base:
message = '用户输入的值必须是 %s.' % self.base
raise serializers.ValidationError(message)
class UserInfoSerializer(serializers.Serializer):
name = serializers.CharField(max_length=32)
pwd = serializers.CharField(max_length=128, error_messages={'required': '密码不能为空'},
validators=[PasswordValidator('666'), ]
  1. 在视图函数里面写post方法,并且根据用户发送的数据做序列化操作
class IndexView(APIView):
def post(self, request):
# 接收POST数据
data = request.POST
# 序列化数据,基于Serializer和ModelSerializer都可以
# ser = UserInfoSerializer(data=data, many=True)
ser = UserInfoModelSerializer(data=data, many=True)
# 判断数据是否符合要求
if ser.is_valid():
print(ser.validated_data) # OrderedDict([('name', 'jack'), ('pwd', '123')])
# models.UserInfo.objects.create(**ser.validated_data)
return Response('添加成功')
return Response("POST测试")

三 Django REST framework配置流程之ModelSerializer

1、基础配置实例

class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
# model表
model = models.UserInfo
fields = '__all__'
# fields = [] # 可以指定字段
# 遍历的深度
depth = 2

2、自定义简单字段实例配置

class UserInfoSerializer(serializers.ModelSerializer):
# 可以通过serializers自定义字段
xxx = serializers.CharField(source="name")
class Meta:
# model表
model = models.UserInfo
fields = '__all__'
# fields = [] # 可以指定字段
# 遍历的深度
depth = 2

3、基于HyperlinkedRelatedField实现url的实例配置

class UserInfoSerializer(serializers.ModelSerializer):
#view_name是用来反向生成url的
xxx = serializers.HyperlinkedRelatedField(view_name="detail")
class Meta:
# model表
model = models.UserInfo
fields = '__all__'
# fields = [] # 可以指定字段
# 遍历的深度
depth = 2
# urls.py配置
urlpatterns = [
# 由于在class HyperlinkedRelatedField(RelatedField)中定义了lookup_field="pk",
# 所以在url中必须使用pk字段
url(r'xxx/(?P<pk>\d+)', views.UserView.as_view(), name='detail'),
]
# UserView配置
class UserView(APIView):
def get(self, request):
user_list = models.UserInfo.objects.all()
ser = UserSerializer(instance=user_list, many=True, content={"request":request})
return Response(ser.data)

4、全部生成url(serializers.HyperlinkedModelSerializer会把每个字段都成条url,默认的view_name是userinfo-detail

class ModelUserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.UserInfo
fields = '__all__' # 生成url
# fields = ['name', 'pwd'] # 只显示字段
# exclude = ['role',]
# urls.py配置
urlpatterns = [
url(r'^xxx/(?P<pk>\d+)', view.UserView.as_view(), name='userinfo-detail'),
url(r'^xxx/(?P<pk>\d+)', view.UserView.as_view(), name='group-detail'),
url(r'^xxx/(?P<pk>\d+)', view.UserView.as_view(), name='role-detail'),
]

Django Rest framework序列化流程的更多相关文章

  1. Django Rest framework实现流程

    目录 一 什么是restful架构 二 Django REST framework简介 三 Django REST framework原理 四 Django REST framework源码流程 五 ...

  2. Django REST Framework序列化器

    Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...

  3. [Django REST framework - 序列化组件、source、钩子函数]

    [Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...

  4. Django REST framework序列化

    一.简介 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官网:https://www.djang ...

  5. 02 Django REST Framework 序列化

    01-创建序列化类 # 方式一: publish_list = models.Publish.objects.all() # 导入序列化组件 from django.core import seria ...

  6. Django Rest Framework 请求流程

    用户请求到django,首先经过wsgi,中间件,然后到url路由系统,执行视图类中继承APIView执行as_view方法,在源码中可以看到VPIView继承了django的View类,通过supe ...

  7. python学习-- Django REST framework 序列化数据操作

    一.为什么要返回json数据? 一般来说前端要用到从后台返回的数据来渲染页面的时候,这时候后台就需要向前端返回json类型的数据,简单直观便于理解 ,就类似于 {"xxx":{[& ...

  8. Django REST Framework 序列化和校验 知识点

    DRF序列化 Django ORM对象 --> JSON格式的数据 序列化 JSON格式的数据 --> Django ORM数据 反序列化 需要两个工具: from rest_framew ...

  9. django rest framework 序列化组件总结

    序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ...

随机推荐

  1. Typora 精美而强大的Markdown编辑器

    Typora 精美而强大的Markdown编辑器  转 https://www.jianshu.com/p/45e284645d30 Markdown编辑器千千万,可是有颜值.功能强并且免费的,就没有 ...

  2. k8s记录-ca证书制作(二)

    1)下载cfssl #!/bin/bash wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R ...

  3. 转 Java连接Oracle数据库的简单示例

    https://www.cnblogs.com/joyny/p/11176643.html https://community.oracle.com/thread/4096458 import jav ...

  4. DEBUG技巧1 SE37将参数保存为测试数据

    1. SE37调试函数的时候,将参数保存为测试数据,供下次调试使用, 或者参考标准的赋值进行赋值 2. SE37 ->执行-> 测试序列 测试函数: CO_XT_COMPONENTS_DE ...

  5. CSS3 《3D骰子 压大小》

    游戏在线预览地址:http://dtdxrk.github.io/game/3d-dice/index.html js判断一个随机数大小的游戏. 本来想用canvas做的,平面的生产一个点数,感觉没啥 ...

  6. keepalived+lvs tcp check 引起的后端服务报Connection reset by peer

    方法一: 取消LVS方式进行tcp转发,进而改为http方式反向代理,问题即可解决. 当然,这是在业务允许使用http的情况下,如果必须使用tcp协议,那就得使用下面的方法了. 方法二: 修改keep ...

  7. 莫比乌斯反演求LCM的另一种做法

    一个经典问题 求 \[ \sum_{k=1}^n\mathbb{lcm}(k,n) \] 一般的做法是使用\(\varphi(n)\)函数. 不经典的做法 \[ \begin{align*} \sum ...

  8. eNSP配置基本与高级访问控制列表

    首先我们进行基本的acl控制 拓扑图如下所示 首先我们对路由器进行基本ip配置 并在路由器上设置ospf协议 添加相邻的网段 在路由器上运行了ospf协议后 使用display ip route-ta ...

  9. Hive行列转换

    Hive行列转换   1.行转列 (根据主键,进行多行合并一列) 使用函数:concat_ws(‘,’,collect_set(column))  collect_list 不去重 collect_s ...

  10. 使用TypeScript创建Vue项目

    Vue的灵活性总是让代码看起来非常洗练,对TypeScript来说也是一种挑战, 好在Vue对TypeScript进行了一次全方位的适配. 相对于React严谨的代码,Redux啰嗦的样板代码,Vue ...