rest_framwork之序列化组件

1 序列化组件
(1)原生序列化
    1)导入
      from django.core.serializers import serializer
    2)使用
      class BookView(APIView):
        def get(self, request):
            books = Book.objects.all()
            #序列化
            serialized_data = serialize("json", books)
            #返回序列化结果
            return HttpResponse(serialized_data)
            
(2)序列化组件
      1)导入
        from rest_framework import serializers
      2) 定义序列化类BookSerializer(字段名必须与model中定义的字段名一样,否则会报错)
        class BookSerializer(serializers.Serializer):
          title= serializers.CharField(max_length=32)
          price=serializers.CharField(max_length=32)
          #显示出来的是Id (多对一,外键字段)
          publish=serializers.CharField(max_length=32)
          publish_name = serializers.CharField(max_length=32, source="publish.name", read_only=True)
          # 多对多字段(该字段名 与下面的get_后面的字段名必须一样)
          authors_list = serializers.SerializerMethodField()
          
          
          #多对多字段的处理(get_是规定写法,后面的名同上authors_list)
          def get_authors_list(self,book_obj):
            authors=list()
            
            for author in book_obj.authors.all():
                authors.append(author.name)
                
            return authors
            
            
            
        3) 定义views.py
        
          #1 首先导入2)步中自定义的序列化类
            class BookView(APIView):
               def get(self,request):
                 #2获取数据
                 books=Book.object.all()
                  #3序列化 (BookSerializer是引入的序列化类)
                 serialized_data=BookSerializer(books,many=True)
                   #4返回序列化结果
                 return Response(serialized_data.data)
                
(3)通过drf的序列化组件进行GET接口设计
        - 定义views.py
        class BookFilterView(APIView):
            def get(self,request,nid):
                 book_obj=-Book.objects.get(pk=nid)
                 ser_data=BookSerializers(book_obj,many=False)
                 print('ser_data',ser_data)
                 return Response(ser_data.data)
                    
            
2 视图组件(mixins)
  视图组件是用来优化接口逻辑的
 (1) 导入
   from rest_framework.mixins import(
     ListModelMixin,
     CreateModelMixin,
     RetrieveModelMixin,
     DestoryModelMixin,
     UpdateModelMixin
     )
   from rest_framework.generics import GenericAPIView
   
   (2) 定义序列化类
    同上定义的序列化类一样
    
   (3) 定义view.py
     class BookView(ListModelMixin, CreateModelMixin, GenericAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        
        def get(self, request):
            return self.list(request)
        
        def post(self, request):
            return self.create(request)
            
    class BookFilterView(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        
        def get(self, request):
            return self.retrieve(request)

        def put(self, request):
            return self.update(request)
        
        def delete(self, request):
            return self.destroy(request)
            
            
3 generic
(1) 导入
from rest_framework import generic

(2)使用
#查看添加
class BookView(generic.ListCreateAPIView):
  #queryset 与 serializer_class 名字是固定的
  queryset = Book.objects.all()
  serializer_class=BookSerializer
 
#更改删除 查看单条数据
class BookView(generic.RetricveUpdateDestroyAPIView):
  queryset= Book.objects.all()
  serializer_class=BookSerializer
 
 
 

4 viewset
(1) 导入
from rest_framework.viewsets import ModelViewSet

(2) 使用
class BookView(ModelViewSet):
  queryset = Book.object.all()
  serializer_class=BookSerializer
 

(3)在url中配置
urlpatterns=[
   re_path(r'books/$', views.BookView.as_view({
   'get':'list';
   'post':'create';
   })),
   re_path(r'books/(?P<pk>d+)/$', views.BookView.as_view({
    'get':'retrieve',
    'put':'update',
    'delete':'destory'
   
   }))
]

原文地址:https://www.cnblogs.com/mlhz/p/10108680.html