• 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')

      

      

  • 相关阅读:
    Atitit.获得向上向下左的右的邻居的方法 软键盘的设计..
    Atitit.css 规范 bem 项目中 CSS 的组织和管理
    Atitit.css 规范 bem  项目中 CSS 的组织和管理
    Atitit.android js 的键盘按键检测Back键Home键和Menu键事件
    Atitit.android js 的键盘按键检测Back键Home键和Menu键事件
    Atitit.java相比c#.net的优点 优缺点  v2 q330
    Atitit.java相比c#.net的优点 优缺点  v2 q330
    Atitit.android  jsbridge v1新特性
    Atitit.android  jsbridge v1新特性
    Atitit. Toast alert loading js控件   atiToast v2新特性
  • 原文地址:https://www.cnblogs.com/qq631243523/p/10084134.html
Copyright © 2020-2023  润新知