zoukankan      html  css  js  c++  java
  • django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤

    版权声明:尊重版权, 从你做起 https://blog.csdn.net/weixin_42359464/article/details/80838997

    http://blog.wktadmin.com

    一. 分页

    二. 过滤


    一. 分页

    rest-framework查询时候默认是不分页的, 除了手动计算查询的起始位置之外, rest-framework也提供了一些页码的设置功能.

    1. 方式1: 直接在setting里添加配置

    在settings中rfw(rest-framework)的所有设置都在REST_FRAMEWORK字典中,(如果不设置将采用rfw的默认设置, 默认设置存放在rest-framework.settings中, 可以在此处查询设置的字段名, 防止拼写错误), 我们修改项目目录下的settings.py

    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 10  # 这是每页显示的数目
    }
    • 1
    • 2
    • 3
    • 4

    完毕 
    此时通过restframe查询之时, 将以每页十条数据显示. 这种方式及其简单, 但是无法对url的页码参数进行’个性化’定制

    • 方式2: 自定义分页(类):

    自定义类需要重写PageNumberPagination, 可以自定义多个参数

    from rest_framework.pagination import PageNumberPagination
    class StandardResultsSetPagination(PageNumberPagination):
        page_size = 10
        page_size_query_param = 'size'
        page_query_param = 'p'
        max_page_size = 100
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    重写后只需在类视图中指定即可

    
    class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
        """
        goods list   
        """
        ...
        pagination_class = StandardResultsSetPagination
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    此时的url变为:

    http://localhost:8000/books/?p=3&size=3
    • 1

    二. 过滤

    • 方式1: 简单设置

    直接在视图指定filter_backends可以快速实现过滤的功能

    from django_filters.rest_framework import DjangoFilterBackend
    class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
        """
        goods list   
        """
        ...
        filter_backends = (DjangoFilterBackend, )  # 过滤
         filter_fields = ('name', 'shop_price')   # 过滤的字段
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    此时通过浏览器访问, 右上角谁多出一个过滤器按钮, 点击即可过滤:

    但是值得注意的是, 这种过滤方式不支持任何模糊搜索的, 必须完全一致才可以匹配到结果. 
    过滤时的url格式为

    http://localhost:8000/books/?name=namss&shop_price=30
    • 1
    • 方式2: 自定义过滤器类

    为了实现模糊搜索, 可以设置一个自定义的过滤器类, 并在视图中完成指定. 
    比如过滤价格区间:

    import django_filters
    from .models import Goods
    class ProductFilter(django_filters.rest_framework.FilterSet):
        '''商品的过滤类'''
        # 比如此处我们进行价格的过滤
        price_min = django_filters.NumberFilter(name="shop_price", lookup_expr='gte')
        price_max = django_filters.NumberFilter(name="shop_price", lookup_expr='lt')
    
        class Meta:
            model = Goods
            fields = ['price_min', 'price_max']  # 使之生效
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    当然, 也需要到视图中指定filter_class

    from django_filters.rest_framework import DjangoFilterBackend
    class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
        """
        goods list   
        """
        ...
        filter_backends = (DjangoFilterBackend, )  # 过滤
        # 自定义的过滤
        filter_class = ProductFilter
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

  • 相关阅读:
    MySQL索引的操作
    MySQL表的操作02
    MySQL表的操作01
    字典实现简单购物车程序
    python 中if和elif的区别
    格式化操作---%方法
    正则表达式相关知识
    实现 像网易云音乐 播放列表那样的弹出型Dialog
    为什么在非UI线程中操作UI的改变失不安全的
    模板方法模式-Template Method
  • 原文地址:https://www.cnblogs.com/hanbowen/p/10069550.html
Copyright © 2011-2022 走看看