Django 序列化的具體使用
一、簡(jiǎn)介
django rest framework 中的序列化組件,可以說(shuō)是其核心組件,也是我們平時(shí)使用最多的組件,它不僅僅有序列化功能,更提供了數(shù)據(jù)驗(yàn)證的功能(與django中的form類似)。
便于展現(xiàn)的序列化操作,我們需要在model添加外鍵、多對(duì)多情況。以下是新的models(請(qǐng)刪除原有的數(shù)據(jù)庫(kù),重新migrate):
models.py
from django.db import models
class UserInfo(models.Model):
user_type_choice = (
(1,"普通用戶"),
(2,"會(huì)員"),
)
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為了減少干擾,在這里進(jìn)行注釋:
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對(duì)象或者單個(gè)model對(duì)象,當(dāng)有多條數(shù)據(jù)時(shí)候,使用many=True,單個(gè)對(duì)象many=Falsereturn HttpResponse(json.dumps(res.data,ensure_ascii=False))
使用瀏覽器訪問(wèn)http://127.0.0.1:8000/api/v1/roles ,結(jié)果如下:

2.自定義序列化字段
當(dāng)數(shù)據(jù)模型中有外鍵或者多對(duì)多時(shí)候,這時(shí)候就需要自定義序列化了
新增用戶信息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() #多對(duì)多序列化方法一
def get_rl(self,obj): #名稱固定:get_定義的字段名稱
"""
自定義序列化
:param obj:傳遞的model對(duì)象,這里已經(jīng)封裝好的
:return:
"""
roles=obj.roles.all().values() #獲取所有的角色
return list(roles) #返回的結(jié)果一定有道是json可序列化的對(duì)象
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對(duì)象或者單個(gè)model對(duì)象,當(dāng)有多條數(shù)據(jù)時(shí)候,使用many=True,單個(gè)對(duì)象many=False
return HttpResponse(json.dumps(res.data,ensure_ascii=False))
訪問(wèn)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() #多對(duì)多序列化方法一
def get_rl(self,obj): #名稱固定:get_定義的字段名稱
"""
自定義序列化
:param obj:傳遞的model對(duì)象,這里已經(jīng)封裝好的
:return:
"""
roles=obj.roles.all().values() #獲取所有的角色
return list(roles) #返回的結(jié)果一定有道是json可序列化的對(duì)象
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對(duì)象或者單個(gè)model對(duì)象,當(dāng)有多條數(shù)據(jù)時(shí)候,使用many=True,單個(gè)對(duì)象many=False
return HttpResponse(json.dumps(res.data,ensure_ascii=False))
3.連表序列化以及深度控制
使用depth進(jìn)行深度控制,越深其序列化的細(xì)讀越高
class UserinfoSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
#fields = "__all__" # 使用model中所有的字段
fields = ['id', 'username', 'password', 'group','roles'] # 配置要序列化的字段
depth = 1 #系列化深度,1~10,建議使用不超過(guò)3
class UserinfoView(APIView):
"""用戶信息"""
def get(self,request,*args,**kwargs):
users=models.UserInfo.objects.all()
res=UserinfoSerializer(instance=users,many=True) #instance接受queryset對(duì)象或者單個(gè)model對(duì)象,當(dāng)有多條數(shù)據(jù)時(shí)候,使用many=True,單個(gè)對(duì)象many=False
return HttpResponse(json.dumps(res.data,ensure_ascii=False))
請(qǐng)求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目標(biāo)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,建議使用不超過(guò)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對(duì)象或者單個(gè)model對(duì)象,當(dāng)有多條數(shù)據(jù)時(shí)候,使用many=True,單個(gè)對(duì)象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對(duì)象或者單個(gè)model對(duì)象,當(dāng)有多條數(shù)據(jù)時(shí)候,使用many=True,單個(gè)對(duì)象many=False
return HttpResponse(json.dumps(res.data,ensure_ascii=False))
此時(shí)訪問(wèn)組信息:http://127.0.0.1:8000/api/v1/group/1,結(jié)果如下:

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

到此這篇關(guān)于Django 序列化的具體使用的文章就介紹到這了,更多相關(guān)Django 序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?EasyDict庫(kù)以屬性方式訪問(wèn)字典元素(無(wú)需使用方括號(hào)和鍵)
在Python中,字典(dict)是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì),然而,有時(shí)候我們希望以屬性的方式訪問(wèn)字典中的元素,而無(wú)需使用方括號(hào)和鍵,這就是EasyDict庫(kù)的用武之地,本文將深入介紹EasyDict庫(kù),展示其強(qiáng)大的功能和如何通過(guò)示例代碼更好地利用它2023-12-12
python實(shí)現(xiàn)數(shù)獨(dú)游戲 java簡(jiǎn)單實(shí)現(xiàn)數(shù)獨(dú)游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)數(shù)獨(dú)游戲和java實(shí)現(xiàn)數(shù)獨(dú)游戲的相關(guān)代碼,比較兩種語(yǔ)言實(shí)現(xiàn)數(shù)獨(dú)游戲的區(qū)別2018-03-03
Django 實(shí)現(xiàn)jwt認(rèn)證的示例
這篇文章主要介紹了Django 實(shí)現(xiàn)jwt 認(rèn)證的示例,幫助大家更好的理解和學(xué)習(xí)使用django,感興趣的朋友可以了解下2021-04-04
Python3標(biāo)準(zhǔn)庫(kù)之threading進(jìn)程中管理并發(fā)操作方法
這篇文章主要介紹了Python3標(biāo)準(zhǔn)庫(kù)之threading進(jìn)程中管理并發(fā)操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python實(shí)現(xiàn)五子棋聯(lián)機(jī)對(duì)戰(zhàn)小游戲
本文主要介紹了通過(guò)Python實(shí)現(xiàn)簡(jiǎn)單的支持聯(lián)機(jī)對(duì)戰(zhàn)的游戲——支持局域網(wǎng)聯(lián)機(jī)對(duì)戰(zhàn)的五子棋小游戲。廢話不多說(shuō),快來(lái)跟隨小編一起學(xué)習(xí)吧2021-12-12
Python使用py2neo操作圖數(shù)據(jù)庫(kù)neo4j的方法詳解
這篇文章主要介紹了Python使用py2neo操作圖數(shù)據(jù)庫(kù)neo4j的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python使用py2neo操作圖數(shù)據(jù)庫(kù)neo4j的具體步驟、原理、相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01
python中的多進(jìn)程的創(chuàng)建與啟動(dòng)方式
這篇文章主要介紹了python中的多進(jìn)程的創(chuàng)建與啟動(dòng),python中的并發(fā)有三種形式,多進(jìn)程、多線程、協(xié)程,執(zhí)?并發(fā)任務(wù)的?的是為了提?程序運(yùn)?的效率,本文通過(guò)實(shí)例代碼詳細(xì)講解需要的朋友可以參考下2022-12-12

