在筆者認爲,在Django rest framework中最重要的是序列化組件,經過序列化咱們能夠將咱們後臺數據經過必定格式發送到咱們的前端,而後經過必定的方法展現咱們的數據。 前端
那麼咱們就開始介紹咱們的序列化組件吧!python
url部分:web
from django.conf.urls import url, include from web.views.s6_serializers import TestView urlpatterns = [ url(r'test/', TestView.as_view(), name='test'), ] urls.py
視圖部分:數據庫
#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers from .. import models class PasswordValidator(object): def __init__(self, base): self.base = base def __call__(self, value): if value != self.base: message = 'This field must be %s.' % self.base raise serializers.ValidationError(message) def set_context(self, serializer_field): """ This hook is called by the serializer instance, prior to the validation call being made. """ # 執行驗證以前調用,serializer_fields是當前字段對象 pass class UserSerializer(serializers.Serializer): ut_title = serializers.CharField(source='ut.title') user = serializers.CharField(min_length=6) pwd = serializers.CharField(error_messages={'required': '密碼不能爲空'}, validators=[PasswordValidator('666')]) class TestView(APIView): def get(self, request, *args, **kwargs): # 序列化,將數據庫查詢字段序列化爲字典 data_list = models.UserInfo.objects.all() ser = UserSerializer(instance=data_list, many=True) # 或 # obj = models.UserInfo.objects.all().first() # ser = UserSerializer(instance=obj, many=False) return Response(ser.data) def post(self, request, *args, **kwargs): # 驗證,對請求發來的數據進行驗證 ser = UserSerializer(data=request.data) if ser.is_valid(): print(ser.validated_data) else: print(ser.errors) return Response('POST請求,響應內容') views.py
from rest_framework import serializers class RolesSerializer(serializers.Serializer): id = serializers.IntegerField() #顯示的順序和這裏的順序有關 title = serializers.CharField() #咱們須要的字段 class RolesView(APIView): def get(self,request,*args,**kwargs): #方式一 # roles = models.Role.objects.all().values('id','title') # roles = list(roles) # ret = json.dumps(roles,ensure_ascii=False)#序列化,改爲False則顯示中文,不幫中文編碼 #方式二 對於querryset [obj,obj,obj] # roles = models.Role.objects.all() # ser = RolesSerializer(instance=roles,many=True)#有多條數據 many=True # # print(ser.data)#是一個有序的字典 # ret = json.dumps(ser.data, ensure_ascii=False) role = models.Role.objects.all().first() ser = RolesSerializer(instance=role, many=False) # 針對單個數據 # print(ser.data)#是一個有序的字典 ret = json.dumps(ser.data, ensure_ascii=False) return HttpResponse(ret)
class UserInfoSerializer(serializers.Serializer): #類名和咱們的orm沒有硬性關係,可是最好是按照數據庫的來這樣能分清 user_type1 = serializers.CharField(source="user_type") user_type2 = serializers.CharField(source="get_user_type_display") username = serializers.CharField() password = serializers.CharField() gp = serializers.CharField(source='group.title') #經過.的方式去連外鍵 # like = serializers.CharField(source='roles.all ') 多對多的時候不能用這種方式,顯示不出來 #--------------------------------------------# rls = serializers.SerializerMethodField() #多對多使用 def get_rls(self,row): role_obj_list = row.roles.all() #字段名 ret=[] for item in role_obj_list: ret.append({'id':item.id,'title':item.title}) return ret class UserInfoSerializer(serializers.ModelSerializer): #ModelSerializer相比上面的類更簡潔 user_type2 = serializers.CharField(source="get_user_type_display") #實現自連,爲何實現 rls = serializers.SerializerMethodField() class Meta: model = models.UserInfo fields = ['id','username','password','user_type2','rls'] def get_rls(self, row): #自定義顯示 role_obj_list = row.roles.all() #字段名 ret=[] for item in role_obj_list: ret.append({'id':item.id,'title':item.title}) return ret
urls.pydjango
urlpatterns = [ re_path(r'^(?P<version>[v1|v2]+)/userinfo/$', views.UserInfoView .as_view(),), re_path(r'^(?P<version>[v1|v2]+)/group/(?P<pk>\d+)$', views.GroupView .as_view(),name='gp'), re_path(r'^(?P<version>[v1|v2]+)/group/(?P<pk>\d+)$', views.GroupView .as_view(),name='gp'), ]
views.pyjson
class UserInfoSerializer(serializers.ModelSerializer): group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='pk') class Meta: model = models.UserInfo fields = ['id','username','password','group','roles'] #fields是固定的變量,不能自定義 depth = 0 #深度控制 感受是向後.一個單位, class UserInfoView(APIView): def get(self,request,*args,**kwargs): users = models.UserInfo.objects.all() ser = UserInfoSerializer(instance=users,many=True,context={'request':request}) ret = json.dumps(ser.data,ensure_ascii=False) #防止出現亂碼,在序列化的時候添加這個 return HttpResponse(ret) class GroupSerializer(serializers.ModelSerializer): # group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='xxx') class Meta: model = models.UserGroup fields = '__all__' # fields = ['id','username','password','group','roles'] #fields是固定的變量,不能自定義 depth = 0 #深度控制 感受是向後.一個單位, class GroupView(APIView): def get(self,request,*args,**kwargs): pk = kwargs.get('pk') obj = models.UserGroup.objects.filter(pk=pk).first() ser = GroupSerializer(instance=obj,many=False) ret = json.dumps(ser.data,ensure_ascii=False) return HttpResponse(ret)