过滤
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 # 排序
排序
- views.py
filter_backends = ( filters.OrderingFilter)
ordering_fields = ('sold_num', 'add_time')
### 跨域
pip install django-cors-headers
# settings.py app
'corsheaders',
# MIDDLEWARE 写在django的middleware里
'corsheaders.middleware.CorsMiddleware',
CORS_ORIGIN_ALLOW_ALL = True