Django 序列化的具体使用

 更新时间:2021年11月18日 10:51:02   作者:等到的等待  
django rest framework 中的序列化组件,本文主要介绍了Django 序列化的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、简介

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 = [

    # url(r'^api/v1/auth', views.AuthView.as_view()),# url(r'^api/v1/order', views.OrderView.as_view()),
    url(r'^api/v1/roles', views.RoleView.as_view()),  # 角色视图
    # 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 = [

    # url(r'^api/v1/auth', views.AuthView.as_view()),# url(r'^api/v1/order', views.OrderView.as_view()),
    url(r'^api/v1/roles', views.RoleView.as_view()),
    url(r'^api/v1/userinfo', views.UserinfoView.as_view()), #用户信息
    # 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()
    #sss=serializers.CharField(source='user_type') #该方法只能拿到user_type的ID
    sss=serializers.CharField(source='get_user_type_display') #自定义字段名称,和数据模型不一致,需要指定source本质调用get_user_type_display()方法获取数据
    #rl=serializers.CharField(source='roles.all.first.name')
    gp=serializers.CharField(source='group.name')
    rl=serializers.SerializerMethodField()   #多对多序列化方法一
    def get_rl(self,obj): #名称固定:get_定义的字段名称
        """
        自定义序列化
        :param obj:传递的model对象,这里已经封装好的
        :return:
        """
        roles=obj.roles.all().values() #获取所有的角色

        return list(roles)  #返回的结果一定有道是json可序列化的对象
    class Meta:
        model = models.UserInfo
        fields = ['id', 'username', 'password', 'sss','rl','gp'] #配置要序列化的字段
        # 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))

访问http://127.0.0.1:8000/api/v1/userinfo ,查看结果:

除了以上的Serializer,还可以使用ModelSerializer,ModelSerializer继承了serializer,其结果和上面示例一样:

class UserinfoSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()  # 定义需要提取的序列化字段,名称和model中定义的字段相同
    username=serializers.CharField()
    password=serializers.CharField()
    #sss=serializers.CharField(source='user_type') #该方法只能拿到user_type的ID
    sss=serializers.CharField(source='get_user_type_display') #自定义字段名称,和数据模型不一致,需要指定source本质调用get_user_type_display()方法获取数据
    #rl=serializers.CharField(source='roles.all.first.name')
    gp=serializers.CharField(source='group.name')
    rl=serializers.SerializerMethodField()   #多对多序列化方法一
    def get_rl(self,obj): #名称固定:get_定义的字段名称
        """
        自定义序列化
        :param obj:传递的model对象,这里已经封装好的
        :return:
        """
        roles=obj.roles.all().values() #获取所有的角色

        return list(roles)  #返回的结果一定有道是json可序列化的对象
    class Meta:
        model = models.UserInfo
        fields = ['id', 'username', 'password', 'sss','rl','gp'] #配置要序列化的字段
        # 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))

3.连表序列化以及深度控制

使用depth进行深度控制,越深其序列化的细读越高

class UserinfoSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.UserInfo
        #fields = "__all__" # 使用model中所有的字段
        fields = ['id', 'username', 'password', 'group','roles']  # 配置要序列化的字段
        depth = 1  #系列化深度,1~10,建议使用不超过3
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))

请求http://127.0.0.1:8000/api/v1/userinfo ,结果如下:

4.序列化字段url

urls.py新加入组url

urlpatterns = [

    # url(r'^api/v1/auth', views.AuthView.as_view()),# url(r'^api/v1/order', views.OrderView.as_view()),
    url(r'^api/v1/roles', views.RoleView.as_view()),
    url(r'^api/v1/userinfo', views.UserinfoView.as_view()),
    url(r'^api/v1/group/(?P<xxx>\d+)', views.GroupView.as_view(),name='gp'),  # 新加入组url
    # url(r'^api/(?P<version>[v1|v2]+)/user', views.UserView.as_view(),name="user_view"),
] 

views.py

class UserinfoSerializer(serializers.ModelSerializer):
    group=serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='xxx')
    #view_name,urls.py目标url的视图别名(name),这里是UserGroup的视图别名
    #lookup_field 给url传递的参数,也就是正则匹配的字段
    #lookup_url_kwarg,url中正则名称,也就是kwargs中的key
    class Meta:
        model = models.UserInfo
        #fields = "__all__" # 使用model中所有的字段
        fields = ['id', 'username', 'password','roles','group']  # 配置要序列化的字段
        depth = 1  #系列化深度,1~10,建议使用不超过3
class UserinfoView(APIView):
    """用户信息"""
    def get(self,request,*args,**kwargs):
        users=models.UserInfo.objects.all()
        res=UserinfoSerializer(instance=users,many=True,context={'request': request}) #instance接受queryset对象或者单个model对象,当有多条数据时候,使用many=True,单个对象many=False
        #若需生成超链接字段,则需要加context={'request': request}
        return HttpResponse(json.dumps(res.data,ensure_ascii=False))

class UserGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserGroup
        fields = "__all__"
        depth = 0


class GroupView(APIView):
    def get(self,request,*args,**kwargs):

        group_id=kwargs.get('xxx')
        group_obj=models.UserGroup.objects.get(id=group_id)
        res=UserGroupSerializer(instance=group_obj,many=False) #instance接受queryset对象或者单个model对象,当有多条数据时候,使用many=True,单个对象many=False
        return HttpResponse(json.dumps(res.data,ensure_ascii=False))

此时访问组信息:http://127.0.0.1:8000/api/v1/group/1,结果如下:

在查看用户信息,此时生成的组就是超链接形式了(便于查看json数据,这里用postman发请求):

到此这篇关于Django 序列化的具体使用的文章就介绍到这了,更多相关Django 序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python EasyDict库以属性方式访问字典元素(无需使用方括号和键)

    Python EasyDict库以属性方式访问字典元素(无需使用方括号和键)

    在Python中,字典(dict)是一种常用的数据结构,用于存储键值对,然而,有时候我们希望以属性的方式访问字典中的元素,而无需使用方括号和键,这就是EasyDict库的用武之地,本文将深入介绍EasyDict库,展示其强大的功能和如何通过示例代码更好地利用它
    2023-12-12
  • python实现数独游戏 java简单实现数独游戏

    python实现数独游戏 java简单实现数独游戏

    这篇文章主要为大家详细介绍了python实现数独游戏和java实现数独游戏的相关代码,比较两种语言实现数独游戏的区别
    2018-03-03
  • Django 实现jwt认证的示例

    Django 实现jwt认证的示例

    这篇文章主要介绍了Django 实现jwt 认证的示例,帮助大家更好的理解和学习使用django,感兴趣的朋友可以了解下
    2021-04-04
  • 详解flask入门模板引擎

    详解flask入门模板引擎

    这篇文章主要介绍了详解flask入门模板引擎,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • python3的输入方式及多组输入方法

    python3的输入方式及多组输入方法

    今天小编就为大家分享一篇python3的输入方式及多组输入方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python3标准库之threading进程中管理并发操作方法

    Python3标准库之threading进程中管理并发操作方法

    这篇文章主要介绍了Python3标准库之threading进程中管理并发操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Python实现五子棋联机对战小游戏

    Python实现五子棋联机对战小游戏

    本文主要介绍了通过Python实现简单的支持联机对战的游戏——支持局域网联机对战的五子棋小游戏。废话不多说,快来跟随小编一起学习吧
    2021-12-12
  • Python类装饰器实现方法详解

    Python类装饰器实现方法详解

    这篇文章主要介绍了Python类装饰器实现方法,结合实例形式较为详细的分析了Python类装饰器的相关概念、原理、实现方法与使用技巧,需要的朋友可以参考下
    2018-12-12
  • Python使用py2neo操作图数据库neo4j的方法详解

    Python使用py2neo操作图数据库neo4j的方法详解

    这篇文章主要介绍了Python使用py2neo操作图数据库neo4j的方法,结合实例形式详细分析了Python使用py2neo操作图数据库neo4j的具体步骤、原理、相关使用技巧与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • python中的多进程的创建与启动方式

    python中的多进程的创建与启动方式

    这篇文章主要介绍了python中的多进程的创建与启动,python中的并发有三种形式,多进程、多线程、协程,执⾏并发任务的⽬的是为了提⾼程序运⾏的效率,本文通过实例代码详细讲解需要的朋友可以参考下
    2022-12-12

最新评论