Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django rest framework(6)----序列化

Django rest framework(6)----序列化

作者头像
zhang_derek
发布于 2018-04-11 04:00:23
发布于 2018-04-11 04:00:23
90800
代码可运行
举报
文章被收录于专栏:有趣的django有趣的django
运行总次数:0
代码可运行

序列化

1.继承Serializer

基本使用 

(1)models.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models

class UserInfo(models.Model):
    USER_TYPE = (
        (1,'普通用户'),
        (2,'VIP'),
        (3,'SVIP')
    )

    user_type = models.IntegerField(choices=USER_TYPE)
    username = models.CharField(max_length=32,unique=True)
    password = models.CharField(max_length=64)
    group = models.ForeignKey('UserGroup',on_delete=models.CASCADE)
    roles = models.ManyToManyField('Role')


class UserToken(models.Model):
    user = models.OneToOneField('UserInfo',on_delete=models.CASCADE)
    token = models.CharField(max_length=64)


class UserGroup(models.Model):
    title = models.CharField(max_length=32)


class Role(models.Model):
    title = models.CharField(max_length=32)

添加Role

(2)api/urls.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
    re_path('(?P<version>[v1|v2]+)/roles/', RolesView.as_view()),   #序列化
]

(3)views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import json

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from . import models


from rest_framework import serializers

#要先写一个序列化的类
class RolesSerializer(serializers.Serializer):
    #Role表里面的字段id和title序列化
    id = serializers.IntegerField()
    title = serializers.CharField()

class RolesView(APIView):
    def get(self,request,*args,**kwargs):
        # 方式一:对于[obj,obj,obj]
        # (Queryset)
        roles = models.Role.objects.all()
        # 序列化,两个参数,instance:接受Queryset(或者对象)   mangy=True表示对Queryset进行处理,mant=False表示对对象进行进行处理
        ser = RolesSerializer(instance=roles,many=True)
        # 转成json格式,ensure_ascii=False表示显示中文,默认为True
        ret = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)

(4)浏览器访问:http://127.0.0.1:8000/api/v1/roles/

 可以显示后台返回的json数据

 (5)方式二

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class RolesView(APIView):
    def get(self,request,*args,**kwargs):
        # 方式一:对于[obj,obj,obj]
        # (Queryset)
        # roles = models.Role.objects.all()
        # 序列化,两个参数,instance:Queryset  如果有多个值,就需要加 mangy=True
        # ser = RolesSerializer(instance=roles,many=True)
        # 转成json格式,ensure_ascii=False表示显示中文,默认为True
        # ret = json.dumps(ser.data,ensure_ascii=False)

        # 方式二:
        role = models.Role.objects.all().first()
        ser = RolesSerializer(instance=role, many=False)
        ret = json.dumps(ser.data, ensure_ascii=False)
        return HttpResponse(ret)

只获取一个

进阶使用

(1)urls.py

添加一个info

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
    re_path('(?P<version>[v1|v2]+)/roles/', RolesView.as_view()),   #序列化
    re_path('(?P<version>[v1|v2]+)/info/', UserInfoView.as_view()),   #序列化
]

(2)views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserInfoSerializer(serializers.Serializer):
    '''序列化用户的信息'''
    #user_type是choices(1,2,3),显示全称的方法用source
    type = serializers.CharField(source="get_user_type_display")
    username = serializers.CharField()
    password = serializers.CharField()
    #group.title:组的名字
    group = serializers.CharField(source="group.title")
    #SerializerMethodField(),表示自定义显示
    #然后写一个自定义的方法
    rls = serializers.SerializerMethodField()

    def get_rls(self,row):
        #获取用户所有的角色
        role_obj_list = row.roles.all()
        ret = []
        #获取角色的id和名字
        #以字典的键值对方式显示
        for item in role_obj_list:
            ret.append({"id":item.id,"title":item.title})
        return ret

class UserInfoView(APIView):
    '''用户的信息'''
    def get(self,request,*args,**kwargs):
        users = models.UserInfo.objects.all()
        ser = UserInfoSerializer(instance=users,many=True)
        ret = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)

自定义方法

 (3)浏览器访问:http://127.0.0.1:8000/api/v1/info/

2.继承 ModelSerializer

把上面的UserInfoSerializer改成继承ModelSerializer的用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# class UserInfoSerializer(serializers.Serializer):
#     '''序列化用户的信息'''
#     #user_type是choices(1,2,3),显示全称的方法用source
#     type = serializers.CharField(source="get_user_type_display")
#     username = serializers.CharField()
#     password = serializers.CharField()
#     #group.title:组的名字
#     group = serializers.CharField(source="group.title")
#     #SerializerMethodField(),表示自定义显示
#     #然后写一个自定义的方法
#     rls = serializers.SerializerMethodField()
#
#     def get_rls(self,row):
#         #获取用户所有的角色
#         role_obj_list = row.roles.all()
#         ret = []
#         #获取角色的id和名字
#         #以字典的键值对方式显示
#         for item in role_obj_list:
#             ret.append({"id":item.id,"title":item.title})
#         return ret


class UserInfoSerializer(serializers.ModelSerializer):
    type = serializers.CharField(source="get_user_type_display")
    group = serializers.CharField(source="group.title")
    rls = serializers.SerializerMethodField()

    def get_rls(self, row):
        # 获取用户所有的角色
        role_obj_list = row.roles.all()
        ret = []
        # 获取角色的id和名字
        # 以字典的键值对方式显示
        for item in role_obj_list:
            ret.append({"id": item.id, "title": item.title})
        return ret

    class Meta:
        model = models.UserInfo
        fields = ['id','username','password','type','group','rls']

class UserInfoView(APIView):
    '''用户的信息'''
    def get(self,request,*args,**kwargs):
        users = models.UserInfo.objects.all()
        ser = UserInfoSerializer(instance=users,many=True)
        ret = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)

结果一模一样

3.自动序列化连表(depth)

继续优化上面的代码,用depth更简单方便

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserInfo
        #fields = "__all__"
        fields = ['id','username','password','group','roles']
        #表示连表的深度
        depth = 1


class UserInfoView(APIView):
    '''用户的信息'''
    def get(self,request,*args,**kwargs):
        users = models.UserInfo.objects.all()
        ser = UserInfoSerializer(instance=users,many=True)
        ret = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)

访问:http://127.0.0.1:8000/api/v1/info/

4.生成url

url.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
    re_path('(?P<version>[v1|v2]+)/group/(?P<pk>\d+)/', GroupView.as_view(),name = 'gp')    #序列化生成url
]

views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserInfoSerializer(serializers.ModelSerializer):
    group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='pk')
    class Meta:
        model = models.UserInfo
        #fields = "__all__"
        fields = ['id','username','password','group','roles']
        #表示连表的深度
        depth = 0


class UserInfoView(APIView):
    '''用户的信息'''
    def get(self,request,*args,**kwargs):
        users = models.UserInfo.objects.all()
        #这里必须要传参数context={'request':request}
        ser = UserInfoSerializer(instance=users,many=True,context={'request':request})
        ret = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)


class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserGroup
        fields = "__all__"

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)

访问:http://127.0.0.1:8000/api/v1/info/

可以获取到group的url

5.用户请求数据验证

基本验证

(1)url.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
    re_path('(?P<version>[v1|v2]+)/usergroup/', UserGroupView.as_view(),)    #序列化做验证
]

(2)views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserGroupSerializer(serializers.Serializer):
    title = serializers.CharField()

class UserGroupView(APIView):
    def post(self,request,*args, **kwargs):
        ser = UserGroupSerializer(data=request.data)
        if ser.is_valid():
            print(ser.validated_data['title'])
        else:
            print(ser.errors)

        return HttpResponse("用户提交数据验证")

用postman发送正确的数据,后台可以拿到

发送空数据,会自动验证数据的合法性

 自定义验证规则

 views.py

添加一个自定义验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#自定义验证规则
class GroupValidation(object):
    def __init__(self,base):
        self.base = base

    def __call__(self, value):
        if not value.startswith(self.base):
            message = "标题必须以%s为开头"%self.base
            raise serializers.ValidationError(message)


class UserGroupSerializer(serializers.Serializer):
    title = serializers.CharField(validators=[GroupValidation('以我开头'),])    

class UserGroupView(APIView):
    def post(self,request,*args, **kwargs):
        ser = UserGroupSerializer(data=request.data)
        if ser.is_valid():
            print(ser.validated_data['title'])
        else:
            print(ser.errors)

        return HttpResponse("用户提交数据验证")

 提交不合法的数据

 后台报错

 提交正确的数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django rest framework(7)----分页
第一种分页  PageNumberPagination 基本使用 (1)urls.py urlpatterns = [ re_path('(?P<version>[v1|v2]+)/page1
zhang_derek
2018/04/11
1.8K0
Django rest framework(7)----分页
Django Rest Framework(版本、解析器、序列化、数据验证)
为了这种情况下每次都要decode,loads,显得麻烦,所以才有的解析器。弥补了django的缺点
用户1214487
2022/03/26
2.3K0
Django Rest Framework(版本、解析器、序列化、数据验证)
DjangoRestFramework,序列化组件、视图组件
    Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},]
changxin7
2019/12/20
2.7K0
DjangoRestFramework,序列化组件、视图组件
rest_framework序列化与反序列化1
自定义序列化的过程,对数据的单查与群查,序列化的过程:ORM操作得到数据,然后将数据序列化成前台可以使用的数据返回给前台。
GH
2019/12/30
9400
经历了源码的痛苦,掌握DRF的核心序列化器
导入:from rest_framework.serializers import Serializer
HammerZe
2022/05/09
8620
经历了源码的痛苦,掌握DRF的核心序列化器
rest_framework框架的基本组件
快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。 models部分: from django.db import models # Create your models here. class Book(models.Model): title=mod
阿强Wwlt
2018/07/09
8850
ModelSerializer序列化器实战
注意 如果实际项目中不需要操作数据库可以使用APIView,如果操作数据库那么推荐使用GenericAPIView
HammerZe
2022/05/09
4100
ModelSerializer序列化器实战
day91-day92-DjangoRestFrameWork序列化&反序列化的使用
2.2.1 from rest_framework import serializers
少年包青菜
2020/03/02
1K0
Django Rest Framework 序列化(中)
Django Rest Framework 序列化(上) 一、进一步使用 Serializer ① 路由 ② 视图 ③ 使用 serializer # choices 字段显示 user_type
小团子
2019/07/18
1.1K0
Django Rest Framework 序列化(中)
drf框架序列化和返序列化
注意点:如果类的字段值应用在反序列化,我们可以在他的字段的属性上加上write_only=True
小小咸鱼YwY
2019/09/11
9030
【微信小程序+Python后台从0到1实战开发】06微信小程序新闻发布及(restful)API调用
day07 功能 1.发布 1.1 小程序 1.2 API from rest_framework.views import APIView from rest_framework.generics import CreateAPIView from rest_framework import serializers from apps.api import models class NewsDetailModelSerializer(serializers.Serializer): key = s
天道Vax的时间宝藏
2021/08/11
6870
Django-DRF | Serializer 序列化
Django REST框架构建Web API。Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2020/01/16
9150
Django-DRF | Serializer 序列化
Django Rest Framework(分页、视图、路由、渲染器)
1、基于limit offset 做分页(如:在url后面加上?offset=0&limit=2,即代表从第0条开始,往后取2条(即1,2))
用户1214487
2022/03/26
1.2K0
Django Rest Framework(分页、视图、路由、渲染器)
Django序列化器的简单使用
为方便理解后面序列化器中的字段,我们先在创建的APP中的models.py 建立一个数据库模型类。
仙人技术
2020/07/08
1.6K0
django rest framework serializers解读
serializers.fieild 我们知道在django中,form也有许多field,那serializers其实也是drf中发挥着这样的功能。我们先简单了解常用的几个field。 常用的field   CharField、BooleanField、IntegerField、DateTimeField这几个用得比较多,我们把外键的field放到后面去说!
程序员同行者
2018/12/12
1.8K0
Django REST 框架详解 04 | 序列化与反序列化及二者整合
建立图书管理系统: 表Book: name, price, img, authors, publish, is_delete, create_time 表Publish: name, address, is_delete, create_time 表Author: name, age, is_delete, create_time 表AuthorDetail: mobile, author, is_delete, create_time
白墨石
2021/01/12
1.2K0
django-rest-framework登陆认证
# -*- coding: utf-8 -*- __author__ = 'YongCong Wu' # @Time : 2018/10/23 15:05 # @Email : : 1922878025@qq.com from rest_framework import exceptions from app import models class FirstAuthtication(object): def authenticate(self, request):
Wyc
2018/11/09
1.3K0
Django REST framework+Vue 打造生鲜超市(四)
五、商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view 利用Django的view实现返回json数据 # goods/view_base.py from django.views.generic import View from goods.models import Goods class GoodsListView(Vie
zhang_derek
2018/04/11
4.9K0
Django REST framework+Vue 打造生鲜超市(四)
Django Rest Framework
https://q1mi.github.io/Django-REST-framework-documentation/
vanguard
2020/07/07
2.4K0
Python进阶40-drf框架(二)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2.1K0
Python进阶40-drf框架(二)
相关推荐
Django rest framework(7)----分页
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验