zoukankan      html  css  js  c++  java
  • RestFramework之序列化组件

    一、restframework的序列化组件的使用

      1.导入序列化组件与模型类

    from rest_framework import serializers
    from app01.models import (
        Book,
        Author,
        Publish
    )

      2.书写序列化类

      

    # 创建一个序列化类
    
    
    class BookSerializer(serializers.Serializer):
        '''
        开始使用序列化
            - 导入模块:from rest_framework import serializers
            - 建立一个序列化类
                class BookSerializer(serializers.Serializer):
                字段可以自定义
            - 获取queryset
                origin_data = Book.objects.all()
            - 开始序列化
                serialized_data = BookSerializer(origin_data, many=True)
            - 获取序列化后的数据,返回给客户端
                return Response(serialized_data.data)
        '''
        title = serializers.CharField(max_length=32)
        price = serializers.DecimalField(max_digits=5,decimal_places=2)
        publish = serializers.CharField(max_length=32)
    
        # 多对多字段需要自己手动获取数据,SerializerMethodField()
        author_list = serializers.SerializerMethodField()
    
        def get_author_list(self,obj):
            '''
            处理多对多关系
            :param obj: Book对象
            :return:
            '''
            #定义作者列表对象
            author_list =list()
            # print(obj.authors.all())
            for author in obj.authors.all():
                author_list.append(author.name)
            return author_list
    
        def create(self, validated_data):
            # {'title': 'Python666', 'price': Decimal('66.00'), 'publish': '2'}
            validated_data['publish_id'] = validated_data.pop('publish')
    
            book = Book.objects.create(**validated_data)
    
            return book
    # 基于ModelSerializer书写的序列化类
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = '__all__'
            extra_kwargs={
                'publish':{'write_only':True},
                'authors':{'write_only':True}
            }
        publish_name = serializers.CharField(max_length=32,source='publish.name',read_only=True)
        publish_place = serializers.CharField(max_length=32,source='publish.place',read_only=True)
    
        author_list = serializers.SerializerMethodField()
    
        def get_author_list(self,obj):
            author_list=[]
            for author in obj.authors.all():
                author_list.append(
                    author.name
                )
            return author_list

      3.视图中的用法

        首先也是要导入restframework中封装view的APIview与响应方式

    from rest_framework.views import APIView
    from rest_framework.response import Response

        然后书写视图类

    class BookListView(APIView):
        # 获取全部
        def get(self,request):
            '''
            1.获取queryset对象
            2.开始序列化,给序列化类传值(quertset)
            3.返回Response(.data)
            :param request:
            :return:
            '''
            data = Book.objects.all()
            serializer_data = BookSerializer(data,many=True)
            return Response(serializer_data.data)
        # 添加
        def post(self,request):
            bs = BookSerializer(data=request.data)
            print(bs)
            if bs.is_valid():
                book = bs.save()
                authors = Author.objects.filter(id__in=request.data['authors'])
                book.authors.add(*authors)
                return Response(bs.data)
            else:
                return Response(bs.errors)
    
    class BookFileView(APIView):
        # 获取一条
        def get(self,request,pk):
            book_obj = Book.objects.get(pk=pk)
            bs = BookSerializer(book_obj ,many=False)
            return Response(bs.data)
        # 修改
        def put(self,request,pk):
            book_obj = BookSerializer(pk=pk)
            bs = BookSerializer(data=request.data,instance=book_obj)
            if bs.is_valid():
                bs.save()
                return Response(bs.data)
            else:
                return Response(bs.errors)
        # 删除
        def delete(self,request,pk):
            Book.objects.get(pk=pk).delete()
            return Response('Delete operation successfully')

      

      

  • 相关阅读:
    十,Geoserver监测(/monitoring)
    九,Geoserver图层(/layers)
    七,Geoserver字体(/fonts)
    六,Geoserver特征类型(/featuretypes)
    五,Geoserver栅格数据仓库(/coveragestores)
    四,Geoserver栅格数据仓库(/coveerages)
    八,Geoserver图层组(/layergroups)
    三,Geoserver矢量数据仓库(/datastores)
    二,Geoserver服务器系统状态(/about/system-status)
    一,关于Geoserver内核信息(/about/manifests)
  • 原文地址:https://www.cnblogs.com/qq631243523/p/10084134.html
Copyright © 2011-2022 走看看