一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Django 序列化的具體使用

Django 序列化的具體使用

2022-03-03 00:26等到的等待 Python

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 ,結果如下:

Django 序列化的具體使用

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 ,查看結果:

Django 序列化的具體使用

除了以上的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 ,結果如下:

Django 序列化的具體使用

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,結果如下:

Django 序列化的具體使用

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

Django 序列化的具體使用

到此這篇關于Django 序列化的具體使用的文章就介紹到這了,更多相關Django 序列化內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7030336852938719245

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天狠天天透 | 青青青青久久国产片免费精品 | 青青久久久 | 三上悠亚国产精品一区 | 武侠艳妇屈辱的张开双腿 | 日本黄色高清视频网站 | 成人伊在线影院 | 果冻传媒在线免费观看 | 美女张开腿让男人桶的 视频 | 精品国产一区二区三区在线 | 99热久久这里只有精品6国产网 | 国产精品一区二区三区免费 | 男人jj视频 | www青青草原| 亚洲国产精品久久久久 | 亚洲国产精品自在自线观看 | 美日韩在线观看 | 亚洲精品精品一区 | 3d动漫美女物被遭强视频 | 国产日韩欧美在线播放 | 日韩一区在线播放 | 亚洲一区二区精品视频 | 免费刷10000名片赞网站 | 海派甜心完整版在线观看 | 99热国产这里只有精品99 | 国产精品久久久久久久久久久久 | 91麻豆精东果冻天美传媒老狼 | 色图大全| 帅小伙和警官同性3p | yy6080午夜国产免费福利 | 久久九九有精品国产23百花影院 | 欧美黑人换爱交换乱理伦片 | 粉嫩极品国产在线观看免费 | 精品国产一区二区三区在线观看 | 欧美三级做爰全过程 | 毛片小视频 | 国产小视频在线 | 糖心vlog麻豆精东影业传媒 | 久久九九亚洲精品 | 2020年新四虎免费 | 荡女人人爱全文免费阅读 |