首页 > 其他 > 详细

(生鲜项目)12. drf 的过滤

时间:2019-12-25 19:20:27      阅读:76      评论:0      收藏:0      [点我收藏+]

第一种方式: 重写get_queryset()方法

goods.views.py

class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
    """
    商品列表页
    """
    queryset = Goods.objects.all()  # 视频的没这句就行,现在的版本必须要有这个
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination  # 需要指定分页的类

    def get_queryset(self):
        queryset = Goods.objects.all()
        min_price = self.request.query_params.get("min_price",0)
        if min_price:
            queryset = queryset.filter(shop_price__gt=int(min_price))
        return queryset

在浏览器中去验证, 下图说明已经生效了

技术分享图片

 

 

 

 

第二种方式:使用django-filter

1.安装django-filter, 之前已经装过了, 这里就不重复安装了, 首先进行filter的配置

settings.py

INSTALLED_APPS = [
    ...
    django_filters,
    ...
]

REST_FRAMEWORK = {
    # filter设置
    DEFAULT_FILTER_BACKENDS: [django_filters.rest_framework.DjangoFilterBackend],
}

goods.views.py

from django_filters.rest_framework import DjangoFilterBackend

# 方法六: 使用 filter 完成过滤
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
    """
    商品列表页
    """
    queryset = Goods.objects.all()  # 视频的没这句就行,现在的版本必须要有这个
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination  # 需要指定分页的类
    filter_backends = [DjangoFilterBackend]  # 指定使用字段过滤
    filterset_fields = [name, shop_price]  # 指定哪些字段过滤

2. 去浏览器验证, 可以发现多了一个过滤器功能

技术分享图片

技术分享图片

 

 

 

 

第三种方式:使用django-filter + 自定义过滤类

1. 我们可以明显感觉到第二种方式的一些缺点, 比如我想查价格大于100且小于200的商品, 它是办不到的, 我想对name字段进行模糊搜索, 它也是办不到的,

这里filter给我们提供了自定义过滤类的方法, 让我们可以实现功能更为复杂的过滤

2. 新建filters.py

import django_filters
from .models import Goods


class GoodsFilter(django_filters.rest_framework.FilterSet):
    """
    商品的过滤类
    """
    # 自定义过滤条件, 价格最小值,价格最大值, name的模糊查询, name的全字段匹配
    price_min = django_filters.NumberFilter(field_name="shop_price", lookup_expr=gte)
    price_max = django_filters.NumberFilter(field_name="shop_price", lookup_expr=lte)
    name = django_filters.CharFilter(field_name="name", lookup_expr=icontains)
    name_equal = django_filters.CharFilter(field_name="name", )

    class Meta:
        model = Goods
        fields = [price_min, price_max, name, name_equal]

3. goos.views.py

from .filters import GoodsFilter

# 方法七: 使用 filter + 自定义过滤类 完成过滤
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    queryset = Goods.objects.all()  # 视频的没这句就行,现在的版本必须要有这个
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination  # 需要指定分页的类
    filter_backends = [DjangoFilterBackend]  # 指定使用字段过滤
    filter_class = GoodsFilter   # 指定自定义的过滤器名称

4. 去浏览器测试, 没有问题, 注意这里的name字段仍然是全字段匹配

技术分享图片

 

 

 

 

 

 

 

 

 

 

----   over  ----

(生鲜项目)12. drf 的过滤

原文:https://www.cnblogs.com/jiangzongyou/p/12098425.html

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