1.get请求的序列化
1 # 1.导入模块 2 from rest_framework import serializers 3 4 5 from app01.models import Book 6 # 2.创建一个序列化类,字段类型不一定要跟model的字段一样 7 8 class BookSerializer(serializers.Serializer): 9 nid = serializers.CharField(max_length=32,read_only=True)10 title = serializers.CharField(max_length=32)11 price = serializers.DecimalField(max_digits=5,decimal_places=2)12 # 外键字段,显示__str__返回值13 publish = serializers.CharField(max_length=32)14 # 多对多字段需要自己手动获取数据,SerializerMethodField()15 authors = serializers.SerializerMethodField()16 17 def get_authors(self,book_obj):18 author_list = list()19 20 for author in book_obj.authors.all():21 author_list.append(author.name)22 23 return author_list
1 from rest_framework.views import APIView 2 from rest_framework.response import Response 3 4 from app01.app_serializers import BookSerializer 5 from app01.models import ( 6 Book, 7 Publish, 8 Author, 9 )10 11 class BookView(APIView):12 13 def get(self,request):14 # 3.获取queryset15 origin_data = Book.objects.all()16 # 4.开始序列化17 serialized_data = BookSerializer(origin_data,many=True)18 return Response(serialized_data.data)
2.post请求(post请求需要自己手动写一个create的方法)
def create(self, validated_data): authors = validated_data.pop("authors") BookObj = Book.objects.create(**validated_data) BookObj.authors.set(authors) return BookObj
1 def post(self,request): 2 3 verified_data = BookSerializer(data=request.data) 4 5 if verified_data.is_valid(): 6 7 verified_data.save(authors = request.data['authors']) 8 9 return Response(verified_data.data)10 else:11 return Response(verified_data.errors)
3.基于ModelSerializer创建的序列化类
1 class BookSerializer(serializers.ModelSerializer): 2 class Meta: 3 model = Book 4 fields = '__all__' 5 """ 6 [ 7 'title', 8 'price', 9 'publish',10 'authors',11 'publish_name',12 'publish_city',13 'authors'14 ]15 """16 17 extra_kwargs = {18 "publish":{ "write_only":True},19 "authors":{ "write_only":True}20 }21 22 publish_name = serializers.CharField(max_length=32,read_only=True,source='publish.name')23 publish_city = serializers.CharField(max_length=32,read_only=True,source='publish.city')24 25 authors_list = serializers.SerializerMethodField()26 27 def get_authors_list(self,book_obj):28 authors_list = list()29 30 for authors in book_obj.authors.all():31 authors_list.append(authors.name)##这个地方不能直接传authors32 33 return authors_list
继承APIView的序列化
1 from rest_framework.views import APIView 2 from rest_framework.response import Response 3 4 path('books/', views.BookView.as_view()), 5 re_path('books/(\d+)/', views.BookFilterView.as_view()), 6 7 class BookView(APIView): 8 9 def get(self,request):10 book_list = Book.objects.all()11 new_book_list = BookSerializer(book_list,many=True)12 13 return Response(new_book_list.data)14 15 def post(self,request):16 17 verfield = BookSerializer(data=request.data,many=False)18 19 if verfield.is_valid():20 verfield.save()21 return Response(verfield.data)22 else:23 return Response(verfield.errors)24 25 class BookFilterView(APIView):26 27 def get(self,request,nid):28 origin_data = Book.objects.get(pk=nid)29 serialized_data = BookSerializer(origin_data,many=False)30 31 return Response(serialized_data.data)32 33 def put(self,request,nid):34 origin_data = Book.objects.get(pk=nid)35 36 verfield = BookSerializer(data=request.data,instance=origin_data,many=False)37 38 if verfield.is_valid():39 verfield.save()40 return Response(verfield.data)41 else:42 return Response(verfield.errors)43 44 def delete(self,request,nid):45 Book.objects.filter(pk=nid).delete()46 47 return Response()
基于mixins的序列化
1 from rest_framework.response import Response 2 from rest_framework import generics 3 from rest_framework.mixins import ( 4 ListModelMixin, 5 RetrieveModelMixin, 6 CreateModelMixin, 7 UpdateModelMixin, 8 DestroyModelMixin, 9 )10
# path('books/', views.BookView.as_view()), # re_path('books/(?P\d+)/', views.BookFilterView.as_view()),
11 class BookView(ListModelMixin,CreateModelMixin,generics.GenericAPIView):12 queryset = Book.objects.all()13 serializer_class = BookSerializer14 15 def get(self,request):16 return self.list(self,request)17 18 def post(self,request):19 return self.list(self,request)20 21 class BookFilterView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,generics.GenericAPIView):22 queryset = Book.objects.all()23 serializer_class = BookSerializer24 25 def get(self,request,*args,**kwargs):26 return self.retrieve(request,*args,**kwargs)27 28 def put(self,request,*args,**kwargs):29 return self.update(request,*args,**kwargs)30 31 def delete(self,request,*args,**kwargs):32 return self.destroy(request,*args,**kwargs)
基于ModelViewSet的序列化
1 path('books/', views.BookView.as_view({ 2 'get':'list', 3 "post":"create" 4 })), 5 re_path('books/(?P\d+)/', views.BookView.as_view({ 6 "get":"retrieve", 7 "put":"update", 8 "delete":"destroy" 9 })),10 11 from rest_framework.viewsets import ModelViewSet12 13 class BookView(ModelViewSet):14 queryset = Book.objects.all()15 serializer_class = BookSerializer