05filter

过滤

settings.py

INSTALLED_APPS = [
    'django_filters',
]

queryset过滤方式

class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    queryset = Goods.objects.all().order_by("id")  # 一定要排序 不然分页会出错
    permission_classes = (IsAuthenticated,)  # 用户未登录则无法请求该接口
    serializer_class = GoodsSerializer  # 序列化
    pagination_class = GoodsPagination  # 分页
    # authentication_classes = (TokenAuthentication,)  # 登录验证
    filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
    ordering_fields = ('sold_num', 'add_time')  # 排序
    # filter_class = GoodsFilter  # 过滤   __init__() got an unexpected keyword argument 'name'
    search_fields = ('name', 'goods_brief', 'goods_desc')  # 搜索

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

自己写filter过滤的方式

# -*- coding: utf-8 -*-

import django_filters

from .models import Goods


class GoodsFilter(django_filters.rest_framework.FilterSet):
    """
    商品的过滤类
    """
    # 注:field_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')
    # top_category = django_filters.NumberFilter(method='top_category_filter')

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

然后在自己的view中加入

filter_class = GoodsFilter  # 过滤

注:如果报错 init() got an unexpected keyword argument 'name'

# 注:field_name为最新版写法,老版本写法为name
 price_min = django_filters.NumberFilter(field_name='shop_price', lookup_expr='gte')

DjangoFilterBackend

views.py

from rest_framework import filters
from django_filters.rest_framework import DjangoFilterBackend
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    queryset = Goods.objects.all().order_by("id")  # 一定要排序 不然分页会出错
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination
    filter_backends = (DjangoFilterBackend, filters.SearchFilter)
    search_fields = ('name', 'goods_brief', 'goods_desc')

注:

search_fields  # 用于搜索过滤
filter_fields  # 精准搜索
filter_class  # 引入自己写的filter文件
ordering_fields  # 排序

排序

  1. views.py
filter_backends = ( filters.OrderingFilter)
    ordering_fields = ('sold_num', 'add_time')
  1. ### 跨域

pip install django-cors-headers
# settings.py app
 'corsheaders',
# MIDDLEWARE  写在django的middleware里
 'corsheaders.middleware.CorsMiddleware',

CORS_ORIGIN_ALLOW_ALL = True