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

第一种方式: 重写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

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

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

 

 

 

 

第二种方式:使用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. 去浏览器验证, 可以发现多了一个过滤器功能

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

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

 

 

 

 

第三种方式:使用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字段仍然是全字段匹配

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

 

 

 

 

 

 

 

 

 

 

----   over  ----

上一篇:vue2.0——过滤器filters


下一篇:请求数据,渲染数据时,最终得到的是一个集合需要用filters进行提取