django: rest-framework的 分页和过滤

本文详细介绍了Django REST框架中实现分页和过滤的两种方式,包括直接配置和自定义类的方法,以及如何实现模糊搜索和价格区间过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

django: rest-framework的 分页和过滤

版权声明:尊重版权, 从你做起 https://blog.youkuaiyun.com/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

转载于:https://www.cnblogs.com/hanbowen/p/10069550.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值