rest-framework序列化

定義:序列化用於對用戶請求數據進行驗證和數據進行序列化。python

基於serializers實現序列化功能數據庫

方式一:   繼承serializers.Serializer   app

:所有自定義字段ide

class Userserializer(serializers.Serializer): name=serializers.CharField() pwd=serializers.CharField() group=serializers.CharField(source='group.title') class Tst(APIView): authentication_classes = [] def get(self,request,*args,**kwargs): user_list=models.UserInfo.objects.all() ser= Userserializer(instance=user_list,many=True,context={'request':request}) return Response(ser.data) 這裏的字段所有本身定義,裏面的group字段是跨表查詢而來
Views代碼

 

方式二: 繼承:   serializers.ModelSerializer  (經常使用)

可基於models自動生成字段.post

class Mypassword: def __init__(self,base): self.base=base print(self.base) def __call__(self,value): print(value,'4444444444444444444444444444') if value!=self.base: raise exceptions.ValidationError('密碼錯誤') class Regiest(serializers.ModelSerializer): class Meta: model=models.UserInfo fields='__all__' depth=1 #必需要加上,表示會經過下面多少層 extra_kwargs={ 'name':{'min_length':6}, #模塊自帶限制條件 'pwd':{'validators':[Mypassword('as'),]} #也能夠本身重寫錯誤信息 }
單純用Serializer模塊

 

這裏經常使用的仍是serializers.ModelSerializer   和serializers.Serializer 一塊兒做用url

class Userserializer(serializers.ModelSerializer): group=serializers.CharField(source='group.title') roles=serializers.CharField(source='roles.name') x1=Groupser(source='roles.all') x2=serializers.SerializerMethodField() #鉤子 x3=serializers.ListField(child=Myrole(),source='roles.all') class Meta: model=models.UserInfo # fields='__all__' fields=['group','roles','x1','x2','x3'] depth=2 def get_x2(self,obj): #1重寫方式一 obj_list=obj.roles.filter(id__gt=1) s_list=[] for s in obj_list: s_list.append(s.name) return s_list class Myrole(serializers.CharField): #方式二 def to_representation(self, value): return {'id':value.id,'name':value.name} class Groupser(serializers.CharField): #方式三 def to_representation(self, value): role_list=[] for role in value: role_list.append(role.name) return role_list
2中方式結合

 

方式三,生成url   spa

serializers.HyperlinkedIdentityField
#!/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 = str(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 ModelUserSerializer(serializers.ModelSerializer): ut = serializers.HyperlinkedIdentityField(view_name='detail') class Meta: model = models.UserInfo fields = "__all__" extra_kwargs = { 'user': {'min_length': 6}, 'pwd': {'validators': [PasswordValidator(666),]}, } class TestView(APIView): def get(self, request, *args, **kwargs): # 序列化,將數據庫查詢字段序列化爲字典 data_list = models.UserInfo.objects.all() ser = ModelUserSerializer(instance=data_list, many=True, context={'request': request}) # 或 # obj = models.UserInfo.objects.all().first() # ser = UserSerializer(instance=obj, many=False) return Response(ser.data) def post(self, request, *args, **kwargs): # 驗證,對請求發來的數據進行驗證 print(request.data) ser = ModelUserSerializer(data=request.data) if ser.is_valid(): print(ser.validated_data) else: print(ser.errors) return Response('POST請求,響應內容')
生成url
相關文章
相關標籤/搜索