序列化用於對用戶請求數據進行驗證和數據進行序列化(爲了解決queryset序列化問題)。html
那什麼是序列化呢?序列化就是把對象轉換成字符串,反序列化就是把字符串轉換成對象數據庫
models.pydjango
from django.db import models # Create your models here. class Group(models.Model): title = models.CharField(max_length=32) mu = models.ForeignKey(to='Menu',default=1) class UserInfo(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) group = models.ForeignKey(to="Group") roles = models.ManyToManyField(to="Role") class Menu(models.Model): name = models.CharField(max_length=21) class Role(models.Model): name = models.CharField(max_length=32)
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers from app03 import models class UsersSerializer(serializers.Serializer): name = serializers.CharField() #字段名字 pwd = serializers.CharField() class UserView(APIView): def get(self,request,*args,**kwargs): # 方式一實現 # user_list = models.UserInfo.objects.values('name','pwd','group__mu','group__title') # print(type(user_list)) # return Response(user_list) # 方式二之多對象 # user_list = models.UserInfo.objects.all() #直接這樣查會報錯,藉助他提供的系列化 # ser = UsersSerializer(instance=user_list,many=True) #可容許多個 # # print(type(ser)) #<class 'rest_framework.serializers.ListSerializer'> # print(ser.data) #返回的是一個有序字典 #方式三之單對象 user = models.UserInfo.objects.all().first() ser = UsersSerializer(instance=user,many=False) return Response(ser.data)
x1 = serializers.CharField(source='group.mu.name') 若是你想跨表拿你任何須要的數據,均可以用上面的這種操做,內部作判斷,若是可用內部就加括號調用了
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers from app03 import models class UsersSerializer(serializers.Serializer): name = serializers.CharField() #字段名字 pwd = serializers.CharField() # group = serializers.CharField() #會顯示對象 # group_id = serializers.CharField() #會顯示id x1 = serializers.CharField(source='group.mu.name') roles = serializers.CharField(source='roles.all') #多對多關係的這樣查出的是queryset對象 class UserView2(APIView): '''跨表操做''' def get(self,request,*args,**kwargs): user = models.UserInfo.objects.all() ser = UsersSerializer(instance=user,many=True) return Response(ser.data)
class MyCharField(serializers.CharField): def to_representation(self, value): ##打印的是全部的數據 data_list = [] for row in value: data_list.append(row.name) return data_list class UsersSerializer(serializers.Serializer): name = serializers.CharField() # obj.name pwd = serializers.CharField() # obj.pwd group_id = serializers.CharField() # obj.group_id xxxx = serializers.CharField(source="group.title") # obj.group.title x1 = serializers.CharField(source="group.mu.name") # obj.mu.name # x2 = serializers.CharField(source="roles.all") # 多對多關係的這樣查出的是queryset對象 x2 = MyCharField(source="roles.all") # obj.mu.name
class MyCharField(serializers.CharField): def to_representation(self, value): return {'id':value.pk, 'name':value.name} class UsersSerializer(serializers.Serializer): name = serializers.CharField() # obj.name pwd = serializers.CharField() # obj.pwd group_id = serializers.CharField() # obj.group_id xxxx = serializers.CharField(source="group.title") # obj.group.title x1 = serializers.CharField(source="group.mu.name") # obj.mu.name # x2 = serializers.CharField(source="roles.all") # obj.mu.name x2 = serializers.ListField(child=MyCharField(),source="roles.all") # obj.mu.name
class UsersSerializer(serializers.Serializer): name = serializers.CharField() # obj.name pwd = serializers.CharField() # obj.pwd group_id = serializers.CharField() # obj.group_id xxxx = serializers.CharField(source="group.title") # obj.group.title x1 = serializers.CharField(source="group.mu.name") # obj.mu.name # x2 = serializers.CharField(source="roles.all") # obj.mu.name # x2 = serializers.ListField(child=MyCharField(),source="roles.all") # obj.mu.name x2 = serializers.SerializerMethodField() def get_x2(self,obj): #get_字段名 print(obj) ##UserInfo object obj.roles.all() role_list = obj.roles.filter(id__gt=1) data_list = [] for row in role_list: data_list.append({'pk':row.pk,'name':row.name}) return data_list
class UsersSerializer(serializers.ModelSerializer): x1 = serializers.CharField(source='name') group = serializers.HyperlinkedIdentityField(view_name='detail') class Meta: model = models.UserInfo # fields = "__all__" fields = ['name','pwd','group','x1'] #自定義字段的時候注意要指定source,scource裏面的數據必須是數據庫有的數據 depth = 1 #表示深度 class UsersView(APIView): def get(self,request,*args,**kwargs): self.dispatch # 方式一: # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title") # return Response(user_list) # 方式二之多對象 user_list = models.UserInfo.objects.all() # [obj1,obj2,obj3] ser = UsersSerializer(instance=user_list,many=True) return Response(ser.data)
class UsersSerializer(serializers.ModelSerializer): # group = serializers.HyperlinkedIdentityField(view_name='detail') class Meta: model = models.UserInfo fields = "__all__" fields = ['name', 'pwd','group'] depth = 1 class UsersView(APIView): def get(self,request,*args,**kwargs): self.dispatch # 方式一: # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title") # return Response(user_list) # 方式二之多對象 user_list = models.UserInfo.objects.all() # [obj1,obj2,obj3] ser = UsersSerializer(instance=user_list,many=True,context={'request':request}) return Response(ser.data)
from django.conf.urls import url,include from django.contrib import admin from app03 import views urlpatterns = [ url(r'^users4/', views.UserView4.as_view(), name='xxx'), #吧users4的group的值反向生成users5的url url(r'^users5/(?P<pk>.*)', views.UserView5.as_view(), name='detail'), #必須叫pk # url(r'^users4/(?P<pk>.*)', views.UserView4.as_view(), name='detail'), ]
class UsersSerializer(serializers.HyperlinkedModelSerializer): #繼承他自動生成 class Meta: model = models.UserInfo fields = "__all__" # fields = ['id','name','pwd'] class UsersView(APIView): def get(self,request,*args,**kwargs): self.dispatch # 方式一: # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title") # return Response(user_list) # 方式二之多對象 user_list = models.UserInfo.objects.all() # [obj1,obj2,obj3] ser = UsersSerializer(instance=user_list,many=True,context={'request':request}) return Response(ser.data)
class PasswordValidator(object): def __init__(self, base): self.base = base def __call__(self, value): if value != self.base: message = '用戶輸入的值必須是 %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 UsersSerializer(serializers.Serializer): name = serializers.CharField(min_length=6) pwd = serializers.CharField(error_messages={'required': '密碼不能爲空'}, validators=[PasswordValidator('666')])
class PasswordValidator(object): def __init__(self, base): self.base = base def __call__(self, value): if value != self.base: message = '用戶輸入的值必須是 %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 UsersSerializer(serializers.ModelSerializer): class Meta: model = models.UserInfo fields = "__all__" #自定義驗證規則 extra_kwargs = { 'name': {'min_length': 6}, 'pwd': {'validators': [PasswordValidator(666), ]} }
class UsersView(APIView): def get(self,request,*args,**kwargs): self.dispatch # 方式一: # user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title") # return Response(user_list) # 方式二之多對象 user_list = models.UserInfo.objects.all() # [obj1,obj2,obj3] ser = UsersSerializer(instance=user_list,many=True,context={'request':request}) return Response(ser.data) def post(self,request,*args,**kwargs): ser = UsersSerializer(data=request.data) if ser.is_valid(): print(ser.validated_data) else: print(ser.errors) return Response('...')
def validate_字段(self,validated_value): raise ValidationError(detail='xxxxxx') return validated_value