【愚公系列】2022年04月 Python教学课程 74-DRF框架之过滤

简介: 【愚公系列】2022年04月 Python教学课程 74-DRF框架之过滤

一、普通过滤

REST 框架的通用列表视图的默认行为是返回模型管理器的整个查询集。通常,您希望 API 限制查询集返回的项目。


筛选子类的任何视图的查询集的最简单方法是重写该方法。GenericAPIView.get_queryset()


重写此方法允许您以多种不同的方式自定义视图返回的查询集。


1.针对当前用户进行筛选

您可能希望筛选查询集,以确保仅返回与发出请求的当前经过身份验证的用户相关的结果。


为此,可以基于用户值进行筛选。request.user


例如:


from myapp.models import Purchase
from myapp.serializers import PurchaseSerializer
from rest_framework import generics
class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer
    def get_queryset(self):
        """
        This view should return a list of all the purchases
        for the currently authenticated user.
        """
        user = self.request.user
        return Purchase.objects.filter(purchaser=user)

2.针对网址进行筛选

一种筛选方式可能涉及根据 URL 的某些部分限制查询集。


例如,如果您的 URL 配置包含如下条目:


re_path('^purchases/(?P.+)/$', PurchaseList.as_view()),

然后,您可以编写一个视图,返回按 URL 的用户名部分筛选查询集:


class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer
    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        username = self.kwargs['username']
        return Purchase.objects.filter(purchaser__username=username)

3.针对查询参数进行筛选

筛选初始查询集的最后一个示例是根据 url 中的查询参数确定初始查询集。


我们可以覆盖以处理 URL,例如 ,并且仅当参数包含在 URL 中时才筛选查询集:


class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer
    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')
        if username is not None:
            queryset = queryset.filter(purchaser__username=username)
        return queryset

二、通用过滤

除了能够重写默认查询集之外,REST 框架还包括对通用筛选后端的支持,这些后端允许您轻松构造复杂的搜索和筛选器。


通用筛选器还可以在可浏览 API 和管理 API 中显示为 HTML 控件。


安装对应的包:pip install django-filter


1.全局设置

INSTALLED_APPS = [
    ...
    'django_filters',
    ...
]
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

2.视图设置

from django_filters.rest_framework import DjangoFilterBackend
class UserListView(generics.ListAPIView):
    ...
    filter_backends = [DjangoFilterBackend]

3.简单过滤

class ProductList(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['category', 'in_stock']
http://example.com/api/products?category=clothing&in_stock=True

4.搜索器过滤

4.1 多字段查找

仅当视图具有属性集时,才会应用该类。该属性应是模型上文本类型字段的名称列表,例如


from rest_framework import filters
class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['username', 'email']
http://example.com/api/users?search=russell

4.2 多字段查找

还可以使用查找 API 双下划线表示法对 ForeignKey 或 ManyToManyField 执行相关查找:


search_fields = ['username', 'email', 'profile__profession']

4.3 嵌套查找

对于 JSONField 和 HStoreField 字段,您可以使用相同的双下划线表示法根据数据结构中的嵌套值进行查找:


search_fields = ['data__breed', 'data__owner__other_pets__0__name']

4.4 参数说明

默认情况下,搜索将使用不区分大小写的部分匹配项。搜索参数可能包含多个搜索词,这些搜索词应以空格和/或逗号分隔。如果使用多个搜索词,则仅当所有提供的词都匹配时,才会在列表中返回对象。


搜索行为可能会因在 前面加上各种字符而受到限制。search_fields


“^”以搜索开头。

“=”完全匹配。

“@”全文搜索。(目前只支持Django的PostgreSQL后端。

‘$’ 正则表达式搜索。

search_fields = ['=username', '=email']

4.5 自定义过滤器

默认情况下,搜索参数名为 ,但该设置可能会覆盖该参数。


若要根据请求内容动态更改搜索字段,可以对 函数进行子类化并覆盖该函数。例如,如果查询参数在请求中,则以下子类将仅搜索


from rest_framework import filters
class CustomSearchFilter(filters.SearchFilter):
    def get_search_fields(self, view, request):
        if request.query_params.get('title_only'):
            return ['title']
        return super().get_search_fields(view, request)
相关文章
|
5月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
427 0
|
5月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
498 1
|
5月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
611 0
|
5月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
315 0
|
6月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
6月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
280 0
|
Python
python:教学工具:随机点名提问答卷
开发需求:一共x道题目,给y个学生抓阄答题.
2042 0
|
6月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
825 102
|
6月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
414 104
|
6月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
332 103

推荐镜像

更多