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 ,結果如下:
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) #返回的結果一定有道是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 ,查看結果:
除了以上的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') #自定義字段名稱,和數(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) #返回的結果一定有道是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 ,結果如下:
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,結果如下:
在查看用戶信息,此時生成的組就是超鏈接形式了(便于查看json數(shù)據(jù),這里用postman發(fā)請求):
到此這篇關于Django 序列化的具體使用的文章就介紹到這了,更多相關Django 序列化內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。