跳转到主要内容

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参数的过滤器:statusmodified_at_minmodified_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指示符的字符串(不区分大小写):yesytruet1。类似地,这些将被视为Falsenonfalsef0

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 (4.5 kB 查看哈希值)

上传时间

构建分布

django_simplefilters-1.0.0-py3-none-any.whl (4.9 kB 查看哈希值)

上传时间 Python 3

由...