Django rest framework 序列化組件

    在筆者認爲,在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

  深度控制以及反向生成URL

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)

  

序列化驗證系列

 

源碼流程

相關文章
相關標籤/搜索