Vue + Django 2.0.6 学习笔记 5.11 过滤2 搜索 排序
程序员文章站
2022-07-14 22:39:55
...
先说过滤,过滤除了上一篇说的到内容还有这些:
from .models import Goods
class GoodsFilter(django_filters.rest_framework.FilterSet):
"""
商品的过滤类
"""
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')
class Meta:
model = Goods
fields = ['price_min','price_max', 'name']
除了大于小于还可以通过文字过滤 具体可参考官方文档
嗯。。好吧 官方文档大致浏览了下没找到
直接看源码 发现:
原来这货直接调用forms的字段设置 那就参照forms的字段就完事了
如果要完全匹配搜索的话就不加lookup_expr
import django_filters
from django.db.models import Q
from .models import Goods
class GoodsFilter(django_filters.rest_framework.FilterSet):
"""
商品的过滤类
"""
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')
class Meta:
model = Goods
fields = ['price_min','price_max', 'name']
效果
再说搜索功能:
官方文档
https://www.django-rest-framework.org/api-guide/filtering/#searchfilter
使用方法:
from rest_framework import filters
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')
filter_class = GoodsFilter
效果
同时 搜索可以匹配正则
回头可以试试
最后说排序:
class GoodsListViewset(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
商品列表页,分页,过滤,搜索,排序
"""
queryset = Goods.objects.all().order_by('id')
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
# 这里 添加排序功能
filter_backends = (DjangoFilterBackend,filters.SearchFilter, filters.OrderingFilter)
search_fields = ('name', 'goods_brief', 'goods_desc')
# 这添加排序字段
ordering_fields = ('sold_num', 'add_time')
filter_class = GoodsFilter
# 如果需要自定义搜索和排序功能也是向上面过滤这样 没验证过 嘿嘿 具体看官方文档
search_class = XXX
ordering_class = XXX
https://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
完结
下一篇: Python Django项目实例一