首页 > 其他 > 详细

DRF的两种View层过滤方式

时间:2019-01-16 13:00:34      阅读:130      评论:0      收藏:0      [点我收藏+]

一般过滤可以重写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]

然后在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实现模糊查询。

 

DRF的两种View层过滤方式

原文:https://www.cnblogs.com/LiuZhiHao/p/10276227.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!