欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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']

除了大于小于还可以通过文字过滤 具体可参考官方文档

嗯。。好吧 官方文档大致浏览了下没找到 

直接看源码 发现:

Vue + Django 2.0.6 学习笔记 5.11 过滤2 搜索 排序

原来这货直接调用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']

效果

Vue + Django 2.0.6 学习笔记 5.11 过滤2 搜索 排序

再说搜索功能:

官方文档

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

效果

Vue + Django 2.0.6 学习笔记 5.11 过滤2 搜索 排序

同时 搜索可以匹配正则

Vue + Django 2.0.6 学习笔记 5.11 过滤2 搜索 排序

回头可以试试

最后说排序:

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

完结