五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

Django 序列化的具體使用

發(fā)布日期:2021-12-09 19:14 | 文章來源:源碼之家

一、簡(jiǎn)介

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

便于展現(xiàn)的序列化操作,我們需要在model添加外鍵、多對(duì)多情況。以下是新的models(請(qǐng)刪除原有的數(shù)據(jù)庫,重新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))

使用瀏覽器訪問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))

訪問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,建議使用不超過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,建議使用不超過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í)訪問組信息: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)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部