最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django 序列化的具體使用

 更新時間:2021年11月18日 10:51:02   作者:等到的等待  
django rest framework 中的序列化組件,本文主要介紹了Django 序列化的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、簡介

django rest framework 中的序列化組件,可以說是其核心組件,也是我們平時使用最多的組件,它不僅僅有序列化功能,更提供了數(shù)據(jù)驗證的功能(與django中的form類似)。

便于展現(xiàn)的序列化操作,我們需要在model添加外鍵、多對多情況。以下是新的models(請刪除原有的數(shù)據(jù)庫,重新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對象,當有多條數(shù)據(jù)時候,使用many=True,單個對象many=Falsereturn HttpResponse(json.dumps(res.data,ensure_ascii=False))

使用瀏覽器訪問http://127.0.0.1:8000/api/v1/roles ,結(jié)果如下:

2.自定義序列化字段

當數(shù)據(jù)模型中有外鍵或者多對多時候,這時候就需要自定義序列化了
新增用戶信息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') #自定義字段名稱,和數(shù)據(jù)模型不一致,需要指定source本質(zhì)調(diào)用get_user_type_display()方法獲取數(shù)據(jù)
    #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對象,這里已經(jīng)封裝好的
        :return:
        """
        roles=obj.roles.all().values() #獲取所有的角色

        return list(roles)  #返回的結(jié)果一定有道是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對象,當有多條數(shù)據(jù)時候,使用many=True,單個對象many=False
        return HttpResponse(json.dumps(res.data,ensure_ascii=False))

訪問http://127.0.0.1:8000/api/v1/userinfo ,查看結(jié)果:

除了以上的Serializer,還可以使用ModelSerializer,ModelSerializer繼承了serializer,其結(jié)果和上面示例一樣:

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') #自定義字段名稱,和數(shù)據(jù)模型不一致,需要指定source本質(zhì)調(diào)用get_user_type_display()方法獲取數(shù)據(jù)
    #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對象,這里已經(jīng)封裝好的
        :return:
        """
        roles=obj.roles.all().values() #獲取所有的角色

        return list(roles)  #返回的結(jié)果一定有道是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對象,當有多條數(shù)據(jù)時候,使用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對象,當有多條數(shù)據(jù)時候,使用many=True,單個對象many=False
        return HttpResponse(json.dumps(res.data,ensure_ascii=False))

請求http://127.0.0.1:8000/api/v1/userinfo ,結(jié)果如下:

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傳遞的參數(shù),也就是正則匹配的字段
    #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對象,當有多條數(shù)據(jù)時候,使用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對象,當有多條數(shù)據(jù)時候,使用many=True,單個對象many=False
        return HttpResponse(json.dumps(res.data,ensure_ascii=False))

此時訪問組信息:http://127.0.0.1:8000/api/v1/group/1,結(jié)果如下:

在查看用戶信息,此時生成的組就是超鏈接形式了(便于查看json數(shù)據(jù),這里用postman發(fā)請求):

到此這篇關(guān)于Django 序列化的具體使用的文章就介紹到這了,更多相關(guān)Django 序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python利用PyQt5設(shè)計鼠標顯示形狀

    python利用PyQt5設(shè)計鼠標顯示形狀

    不知道大家有沒有發(fā)現(xiàn),我們在網(wǎng)頁移動鼠標時,不同的網(wǎng)頁會有不同的鼠標移動特效,通過移動鼠標,會形成類似蜘蛛網(wǎng)等等的特效,本文將用PyQt5實現(xiàn)這一特效,需要的可以參考一下
    2024-07-07
  • Python3利用SMTP協(xié)議發(fā)送E-mail電子郵件的方法

    Python3利用SMTP協(xié)議發(fā)送E-mail電子郵件的方法

    SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。下面這篇文章主要給大家介紹了關(guān)于Python3如何利用SMTP協(xié)議發(fā)送E-mail電子郵件的方法,需要的朋友可以參考下。
    2017-09-09
  • Python繪制散點圖之可視化神器pyecharts

    Python繪制散點圖之可視化神器pyecharts

    這篇文章主要介紹了Python繪制散點圖之可視化神器pyecharts,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Python圖像運算之圖像閾值化處理詳解

    Python圖像運算之圖像閾值化處理詳解

    這篇文章將詳細講解圖像閾值化處理,涉及閾值化處理、固定閾值化處理和自適應(yīng)閾值化處理,這是圖像邊緣檢測或圖像增強等處理的基礎(chǔ),感興趣的可以了解一下
    2022-04-04
  • 分享15個最受歡迎的Python開源框架

    分享15個最受歡迎的Python開源框架

    以下是從GitHub中整理出的15個最受歡迎的Python開源框架。這些框架包括事件I/O,OLAP,Web開發(fā),高性能網(wǎng)絡(luò)通信,測試,爬蟲等
    2014-07-07
  • python?Pandas之DataFrame索引及選取數(shù)據(jù)

    python?Pandas之DataFrame索引及選取數(shù)據(jù)

    這篇文章主要介紹了python?Pandas之DataFrame索引及選取數(shù)據(jù),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • Python3實現(xiàn)獲取圖片文字里中文的方法分析

    Python3實現(xiàn)獲取圖片文字里中文的方法分析

    這篇文章主要介紹了Python3實現(xiàn)獲取圖片文字里中文的方法,結(jié)合實例形式分析了Python基于文字識別引擎tesseract-ocr針對圖片里中文識別的相關(guān)操作技巧與操作注意事項,需要的朋友可以參考下
    2018-12-12
  • Python實現(xiàn)快速生成SQL語句的示例詳解

    Python實現(xiàn)快速生成SQL語句的示例詳解

    這篇文章主要介紹了如何使用Python中的字符串操作和數(shù)據(jù)結(jié)構(gòu),以及一些庫來自動生成SQL語句的技巧,感興趣的小伙伴可以跟隨小編一起學(xué)習一下
    2024-04-04
  • Selenium瀏覽器自動化如何上傳文件

    Selenium瀏覽器自動化如何上傳文件

    本文主要介紹了Selenium瀏覽器自動化如何上傳文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-04-04
  • Python實現(xiàn)全局變量的兩個解決方法

    Python實現(xiàn)全局變量的兩個解決方法

    這篇文章主要介紹了Python實現(xiàn)全局變量的兩個解決方法,需要的朋友可以參考下
    2014-07-07

最新評論

朝阳县| 克山县| 吴桥县| 衡水市| 宣化县| 石嘴山市| 上虞市| 兰考县| 彭泽县| 永新县| 山东省| 通海县| 青岛市| 龙里县| 礼泉县| 太仓市| 彰化县| 浦城县| 水富县| 云南省| 永川市| 康乐县| 治县。| 江陵县| 通海县| 同仁县| 清苑县| 潼关县| 南皮县| 文安县| 玉溪市| 罗定市| 衡山县| 锦州市| 罗城| 富宁县| 通江县| 阿克苏市| 耒阳市| 阿荣旗| 尼勒克县|