rest_framework.filters的简单替换方案
项目描述
django-simplefilters
这是一个内置Django Rest Framework过滤器包的替换方案。它提供了一个简单的方法从URL中检索参数,并使用它们来缩小查询集的结果。
与其他解决方案(例如django-filter)的主要区别在于,我们不尝试处理每种情况,实际的过滤留给用户实现。这可能听起来与过滤库不符,但我们相信在许多情况下,编写像以下这样的代码会更简单:
class EntryFilterSet(filters.FilterSet):
@filters.CharFilter(many=True)
def filter_status(self, queryset, values):
return queryset.filter(status__in=values)
而不是试图在您的过滤库文档中找到这个特殊案例(多个值)。
安装
$ pip install django-simplefilters
使用
让我们假设我们有一个Entry
模型,具有以下属性
status_choices = ((c, c) for c in ['draft', 'published', 'archived'])
class Entry(models.Model):
title = models.CharField(max_length=64)
status = models.CharField(max_length=16, choices=status_choices)
modified_at = models.DateTimeField(auto_now=True)
并且我们希望允许所有者通过其状态和修改日期来过滤条目。
我们首先需要定义我们的过滤器集
# entries/filtersets.py
import simplefilters as filters
class Entry(filters.FilterSet):
@filters.CharFilter()
def filter_status(self, queryset, value):
return queryset.filter(status=value)
@filters.DateTimeFilter()
def filter_modified_at_min(self, queryset, ts):
return queryset.filter(modified_at__gte=ts)
@filters.DateTimeFilter()
def filter_modified_at_max(self, queryset, ts):
return queryset.filter(modified_at__lte=ts)
大部分应该是自解释的,但重要的一点是,我们如何指示URL参数。这可以通过与序列化器中的验证类似的方式实现:参数的名称前面加上了filter_
字符串。因此,上面的代码定义了以下URL参数的过滤器:status
、modified_at_min
和modified_at_max
。
然后在相应的ViewSet类中钩子它
# entries/views.py
from . import filtersets
from . import models
import simplefilters as filters
class EntryViewSet(ModelViewSet):
serializer_class = ...
filter_backends = [filters.DjangoFilterBackend]
filter_class = filtersets.Entry
class Meta:
model = models.Entry
现在用户将能够执行以下查询
GET /entries?status=draft
GET /entries?modified_at_min=2018-03-30T14:00Z
etc.
支持的过滤器
根据定义,用户输入的查询参数只是一个字符串。因此,CharField
是最简单和最基本的过滤器。但有时我们需要接受其他类型,例如数字、时间戳或标志。
以下是所有可用过滤器的完整列表
CharFilter
最基础的过滤器。这里没有做任何特别的事情。
IntegerFilter
参数被转换为整数。
FlagFilter
参数被转换为布尔值。被视为True
指示符的字符串(不区分大小写):yes
、y
、true
、t
和1
。类似地,这些将被视为False
:no
、n
、false
、f
和0
。
DateTimeFilter
参数被转换为 datetime
对象。
多个参数
有时我们希望从URL中传递多个参数。例如,我们可能希望允许用户根据多个状态值进行筛选并执行类似操作
GET /entries?status=draft&status=archived
为此,只需在筛选方法定义中指定我们想要使用 many
个值即可
@filters.CharFilter(many=True)
def filter_status(self, queryset, values):
return queryset.filter(status__in=values)
项目详情
下载文件
下载适用于您平台的自定义文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
构建分布
django-simplefilters-1.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a9fbebc7a6c14c8835d687b125831d3de6ff857ad6192c8d4c6044e01e4d0828 |
|
MD5 | 2a8eb804b8a0c04b475f123a3756d83f |
|
BLAKE2b-256 | 43009f43ce3c9708b2f77f41a2ded6488012d7ad396329ff85c26821220b3fc8 |
django-simplefilters-1.0.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4200ee4273df294fadf762ea498a173efdff1bf0943e1b06549cb652f4bff577 |
|
MD5 | 66ee9835f5d61a1d7c5b6c7947766ee6 |
|
BLAKE2b-256 | 687c78029c6d9ad04c3d666a883e5070ed10af7258cafefb4044e2b7da64c0ff |