zoukankan      html  css  js  c++  java
  • djangodrf——过滤,查找,排序,GenericAPIView——实现分页

    drf:过滤,查找,排序

    字段过滤

    一般过滤可以重写get_queryset方法实现,这时候就可以去掉queryset这个属性了:``

    [复制代码]

    class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        serializer_class = GoodsSerializer
        pagination_class = GoodsPagination
    
        # 覆写GenericAPIView下的该方法,以实现自己对query_set的返回加一些逻辑
        def get_queryset(self):
            # 获取url参数中传过来的"要查询的商品的价格阈值",如果没有传就设置为0
            price_min = self.request.query_params.get("price_min", 0)
            return Goods.objects.filter(shop_price__gt=price_min).order_by("shop_price")
    

    [复制代码]

    现在就可以通过在url里指定参数price_min来实现对获取到的商品价格的过滤了。

    注意在使用这种方法时,要在router.register里配置base_name,不然运行不了。

    还可以使用django-filter,这个要把它注册为app,然后就能用了(因为这时候不需要重写get_queryset方法了,所以就需要把queryset这个属性拿回来)。然后可以自定义一个filters.py用来写自定义过滤规则的过滤器:

    [复制代码]

    from django_filters import rest_framework as filters
    
    from .models import Goods
    
    
    class GoodsFilter(filters.FilterSet):
        """商品的过滤类"""
        # 区间查询,指定区间的最大最小值
        min_price = filters.NumberFilter(field_name="shop_price", lookup_expr='gte')
        max_price = filters.NumberFilter(field_name="shop_price", lookup_expr='lte')
        # 模糊查询,这里带i是忽略大小写
        name = filters.CharFilter(field_name="name", lookup_expr="icontains")
    
        class Meta:
            model = Goods
            fields = ['min_price', 'max_price', 'name']
    

    models.py

    teacher = models.ForeignKey('Teacher', on_delete=models.SET_NULL, null=True) 
    

    # 跨表查询

    teacher = django_filters.CharFilter(field_name='teacher__name')
    

    BooleanFilter

    status = filters.BooleanFilter(field_name="plan_complete")  # 前端 1 或 0
    

    [复制代码]
    然后在views.py的相关视图类里指定filter_class为这个自定义的过滤器类:

    [复制代码]

    from .filters import GoodsFilter
    
    class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        serializer_class = GoodsSerializer
        pagination_class = GoodsPagination
        filter_backends = (DjangoFilterBackend,)
        queryset = Goods.objects.all()
        # filter_fields = ('name', 'shop_price')
        filter_class = GoodsFilter
    

    [复制代码]

    在这个例子里配置完了之后,效果就是可以在url里指定min_price和max_price的值,来控制所返回的JSON中上shop_price值所在的区间,实现区间过滤;使用name实现模糊查询。

    全局配置:

    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
    }
    

    查找

    要实现查找,只要在视图层配置filters.SearchFilter和search_fields=要查找的字段元组即可:

    [复制代码]

    from rest_framework import filters
    
    class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        serializer_class = GoodsSerializer
        pagination_class = GoodsPagination
        filter_backends = (DjangoFilterBackend, filters.SearchFilter)
        queryset = Goods.objects.all()
        # filter_fields = ('name', 'shop_price')
        filter_class = GoodsFilter
        search_fields = ('name', 'goods_brief', 'goods_desc')
    

    [复制代码]
    一些符号可以实现复杂的查找方式,比如以。。开头,全文搜索之类的。

    排序

    要实现排序,只要在视图层配置filters.OrderingFilter和ordering_fields=要排序的字段即可:

    [复制代码]

    class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        serializer_class = GoodsSerializer
        pagination_class = GoodsPagination
        filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
        queryset = Goods.objects.all()
        # filter_fields = ('name', 'shop_price')
        filter_class = GoodsFilter
        search_fields = ('name', 'goods_brief', 'goods_desc')
        ordering_fields = ('sold_num', 'add_time')
    

    原文链接:https://www.cnblogs.com/LauZyHou/p/10276227.html

    GenericAPIView——实现分页

    class A(GenericAPIView):
        queryset = UserInfo.objects.all()
        serializer_class = Ser
        pagination_class = paginations.Pagination
        filter_backends = (DjangoFilterBackend,)
        filter_class = drffilters.UsersFilter
    
    
        def get(self,requsest,version):
            msg = {'code': status.OK, 'message': '操作成功', 'data': ''}
            qs = self.filter_queryset(self.get_queryset())
            page = self.paginate_queryset(qs)
            serializer_obj = self.get_serializer(instance=page, many=True)
            if page:
                msg['data'] = serializer_obj.data
                return self.get_paginated_response(msg)
            msg['data'] = serializer_obj.data
            return Response(msg)
    
  • 相关阅读:
    JDBC连接MySQL数据库及演示样例
    用 managedQuery() 时须要注意的一个陷阱
    JAVA Calendar具体解释
    serialVersionUID作用
    D3DXMatrixMultiply 函数
    不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句
    破解中国电信华为无线猫路由(HG522-C)自己主动拨号+不限电脑数+iTV
    数据库的增删改查和使用流程
    OutputCache说明
    HDU 4292Food(网络流的最大流量)
  • 原文地址:https://www.cnblogs.com/pythonwl/p/13963261.html
Copyright © 2011-2022 走看看