zoukankan      html  css  js  c++  java
  • django restframeowrk filter,search,order

    django-filters非常成熟,并且支持drf,在url中以Get参数的形式体现

    filter

    通用过滤

    1. 基本配置

    $ pip install django-filters
    

    settings.py

    INSTALLED_APPS = [
        ......
        'django_filters'
    ]
    

    views.py

    from django_filters.rest_framework import DjangoFilterBackend
    # 注意点,继承viewsets.GenericViewSet
    filter_backends = (DjangoFilterBackend, )
    filter_fields = ('username',)

    当然我们也可以自行通过current user,url, query parameters过滤

        def get_queryset(self):
            """
            Optionally restricts the returned purchases to a given user,
            by filtering against a `username` query parameter in the URL.
            """
            queryset = Purchase.objects.all()
            username = self.request.query_params.get('username', None)
            if username is not None:
                queryset = queryset.filter(purchaser__username=username)
            return queryset
    

      优点:满足任何需求。 缺点:需要写较多代码。

    2. 进阶

    通常在对应app下创建filters.py

    import django_filters
    
    from .models import Goods
    
    class GoodsFilter(django_filters.rest_framework.FilterSet):
        min_price = django_filters.NumberFilter(name='shop_price', lookup_expr='gte')
        max_price = django_filters.NumberFilter(name='shop_price', lookup_expr='lte')
    
        class Meta:
            model = Goods
            fields = ['min_price','max_price']
    

      

    1. name 代表Model中的字段
    2. lookup_expr而是djangoORM查询提供的查询方法(gt等于model.objects.filter(xx__gt=xx))

    views.py中使用filter_class

    filter_class = GoodsFilter
    

      

    Search

    搜索功能使用的是Drf自带的内容。Drf将搜索功能也融入了filter中,所以配置与filter类似。

    在filter_backends中加入搜索功能

    from rest_framework import filters
    
    filter_backends = (DjangoFilterBackend,filters.SearchFilter)
    

    指明查询字段

    search_fields = ('username',)
    

    源码:提供了四种查询方式,准确查询就用=

    class SearchFilter(BaseFilterBackend):
        # The URL query parameter used for the search.
        search_param = api_settings.SEARCH_PARAM
        template = 'rest_framework/filters/search.html'
        lookup_prefixes = {
            '^': 'istartswith',
            '=': 'iexact',
            '@': 'search',
            '$': 'iregex',
        }
        search_title = _('Search')
        search_description = _('A search term.')
    

      

    Order

    排序同搜索

    filter_backends = (DjangoFilterBackend,filters.OrderingFilter)
    
    ordering_fields = ('id',)
    

      

  • 相关阅读:
    数据库备份与还原
    启明星产品与微软Active Directory活动目录集成说明
    启明星请假系统里,计算工作日的实现
    启明星会议室预定系统Outlook版开始支持Exchange2013与Office365版
    Jquery Mobile实例--利用优酷JSON接口读取视频数据
    高性能且线程安全的两种格式化日期方式
    将数列唯一值化后再求中值的效率比较 第一方案胜出,加索引后在近两百万数据中查出中值耗时0.176秒
    Oracle WITH 语句 语法
    新三种求数列中值SQL之效率再比拼
    rank,dense_rank和row_number函数区别
  • 原文地址:https://www.cnblogs.com/zenan/p/10606603.html
Copyright © 2011-2022 走看看