美文网首页
Python Web框架 Django - 分页、过滤、自定义返

Python Web框架 Django - 分页、过滤、自定义返

作者: 莫名ypc | 来源:发表于2018-12-07 16:53 被阅读0次

    rest配置分页

    # rest配置
    REST_FRAMEWORK = {
        # 分页配置
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        # 设置一页的条数
        'PAGE_SIZE': 2,
    
    }
    

    接口返回的数据

    "count": 7,
            "next": "http://127.0.0.1:8080/api/article/art/?page=2",
            "previous": null,
            "results": [
                {
                    "id": 2,
                    "title": "标题1 ",
                    "desc": "描述1 ",
                    "content": "内容1 ",
                    "atype": "python"
                },
                {
                    "id": 3,
                    "title": "标题啊啊",
                    "desc": "来点描述",
                    "content": "这里搞点正文",
                    "atype": "C"
                }
            ]
    

    处理patch访问时的空值

    from rest_framework import serializers
    
    from article.models import Article
    
    
    class ArticleSerializer(serializers.ModelSerializer):
        desc = serializers.CharField(min_length=2,
                                     max_length=100,
                                     error_messages={
                                         'required': '描述必填',
                                         'max_length': '描述不超过100个字符',
                                         'min_length': '描述不少于两个字符'
                                     })
        title = serializers.CharField(min_length=2,
                                      max_length=100,
                                      error_messages={
                                          'required': '标题必填',
                                          'min_length': '标题不少于两个字符',
                                          'max_length': '标题不超过100个字符'
                                      })
        content = serializers.CharField(min_length=5,
                                        error_messages={
                                            'required': '内容必填',
                                            'min_length': '内容不少于5个字符'
                                        })
    
        class Meta:
            # 序列化的模型
            model = Article
            # 需要序列化的字段
            fields = ['id', 'title', 'desc', 'content', 'atype']
    

    过滤

    安装过滤的库

    pip install django-filter
    

    配置settings.py文件

    # rest配置
    REST_FRAMEWORK = {
        # 分页配置
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        # 设置一页的条数
        'PAGE_SIZE': 2,
    
        # 配置过滤
        'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',
                                    'rest_framework.filters.SearchFilter'),
    
    }
    

    在views中指定filter_class

    class ArticleView(viewsets.GenericViewSet,
                      mixins.ListModelMixin,
                      mixins.DestroyModelMixin,
                      mixins.CreateModelMixin,
                      mixins.UpdateModelMixin,
                      mixins.RetrieveModelMixin):
        # 查询返回的数据
        queryset = Article.objects.filter(is_delete=0)
        # 序列化返回的文章数据
        serializer_class = ArticleSerializer
        # 过滤
        filter_class = ArticleFilter
    

    filter_class中的内容

    from rest_framework import filters
    import django_filters
    
    from article.models import Article
    
    
    class ArticleFilter(filters.FilterSet):
    
        # 过滤URL中title参数
        title = django_filters.CharFilter('title', lookup_expr='contains')
        # 过滤URL中desc参数
        desc = django_filters.CharFilter('desc', lookup_expr='contains')
        # 过滤URL中content参数
        content = django_filters.CharFilter('content', lookup_expr='contains')
        # 过滤URL中时间最小值min_time
        min_time = django_filters.DateTimeFilter('create_time', lookup_expr='gt')
        # 过滤URL中时间最大值max_time
        max_time = django_filters.DateTimeFilter('create_time', lookup_expr='lt')
    
        class Meta:
            model = Article
            fields = ['title', 'desc', 'content', 'min_time', 'max_time']
    

    多对多关联关系过滤

    修改序列化类
    序列化时会默认调用to_representation方法,返回的结果为当前的instance对象的序列化结果

    from rest_framework import serializers
    
    from article.models import Article
    
    
    class ArticleSerializer(serializers.ModelSerializer):
        desc = serializers.CharField(min_length=2,
                                     max_length=100,
                                     error_messages={
                                         'required': '描述必填',
                                         'max_length': '描述不超过100个字符',
                                         'min_length': '描述不少于两个字符'
                                     })
        title = serializers.CharField(min_length=2,
                                      max_length=100,
                                      error_messages={
                                          'required': '标题必填',
                                          'min_length': '标题不少于两个字符',
                                          'max_length': '标题不超过100个字符'
                                      })
        content = serializers.CharField(min_length=5,
                                        error_messages={
                                            'required': '内容必填',
                                            'min_length': '内容不少于5个字符'
                                        })
    
        class Meta:
            # 序列化的模型
            model = Article
            # 需要序列化的字段
            fields = ['id', 'title', 'desc', 'content', 'atype']
    
        def to_representation(self, instance):
            # 序列化时会默认调用该方法,返回的结果为当前的instance对象的序列化结果
            data = super().to_representation(instance)
            if instance.atype:
                data['atype'] = instance.atype.t_name
            return data
    

    自定义返回数据格式

    配置自定义render

    # rest配置
    REST_FRAMEWORK = {
        # 分页配置
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        # 设置一页的条数
        'PAGE_SIZE': 2,
    
        # 配置过滤
        'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',
                                    'rest_framework.filters.SearchFilter'),
    
        # 配置自定义render
        'DEFAULT_RENDERER_CLASSES': (
            'utils.MyRender.CustomRenderer',
        )
    
    }
    

    修改在settings中指定的自定义render类

    
    from rest_framework.renderers import JSONRenderer
    
    
    class CustomRenderer(JSONRenderer):
        """
        重构返回结果的函数
        {
            'code': 200,
            'msg': '请求成功',
            'data': {
    
            }
        }
    
        """
        def render(self, data, accepted_media_type=None, renderer_context=None):
            try:
                code = data.pop('code')
                msg = data.pop('msg')
            except:
                code = 200
                msg = '请求成功'
    
            my_data = {
                'code': code,
                'msg': msg,
                'data': data
            }
            return super().render(my_data, accepted_media_type=None, renderer_context=None)
    

    views.py文件内容

    from django.shortcuts import render
    
    from rest_framework import mixins, viewsets, status
    from rest_framework.response import Response
    
    from article.article_filter import ArticleFilter
    from article.article_serializer import ArticleSerializer
    from article.models import Article
    
    
    class ArticleView(viewsets.GenericViewSet,
                      mixins.ListModelMixin,
                      mixins.DestroyModelMixin,
                      mixins.CreateModelMixin,
                      mixins.UpdateModelMixin,
                      mixins.RetrieveModelMixin):
        # 查询返回的数据
        queryset = Article.objects.filter(is_delete=0)
        # 序列化返回的文章数据
        serializer_class = ArticleSerializer
        # 过滤
        filter_class = ArticleFilter
    
        def perform_destroy(self, instance):
            instance.is_delete = 1
            instance.save()
    
        def retrieve(self, request, *args, **kwargs):
            try:
                instance = self.get_object()
                serializer = self.get_serializer(instance)
                return Response(serializer.data)
            except:
                data = {}
                data['code'] = 500
                data['msg'] = '获取数据失败'
                return Response(data)
    
        # def get_queryset(self):
        #     search_title = self.request.GET.get('title')
        #     search_desc = self.request.GET.get('desc')
        #     search_content = self.request.GET.get('content')
        #     # 既要搜索title, desc,content
        #     if not search_title and not search_desc and not search_content:
        #         return self.queryset
        #     return self.queryset.filter(title__contains=search_title)
    

    相关文章

      网友评论

          本文标题:Python Web框架 Django - 分页、过滤、自定义返

          本文链接:https://www.haomeiwen.com/subject/jivthqtx.html