rest_framework.filters的简单替换

django-simplefilters的Python项目详细描述


django simplefilters

这是内置django rest framework filters包的替换。它提供了一种从url检索参数并使用它们来缩小queryset结果范围的简单方法。

与其他解决方案(即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 param。这与序列化程序中的验证类似:参数名的前缀是filter_字符串。因此,上面的代码定义了以下url参数的过滤器:statusmodified_at_minmodified_at_max

然后将其挂接到相应的视图集类:

# 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.

支持的筛选器

根据定义,用户输入的任何查询参数都只是一个字符串。因此,CharFiled是最简单和最基本的过滤器。但有时我们需要接受其他类型,即数字、时间戳或标志。

以下是可用筛选器的完整列表:

CharFilter

最基本的过滤器。这里没有什么新奇的事。

IntegerFilter

param被强制转换为整数。

FlagFilter

帕拉姆被铸成布尔。将被视为True指示符的字符串(不区分大小写):yesytruet1。类似地,这些将被视为Falsenonfalsef0

DateTimeFilter

param被强制转换为datetime对象。

多个参数

有时我们想从url传递多个参数。在示例中,我们可能希望允许用户按多个状态值进行筛选,并执行如下操作:

GET /entries?status=draft&status=archived

为此,只需指示我们要在过滤器方法定义中使用many值:

  @filters.CharFilter(many)
  def filter_status(self, queryset, values):
      return queryset.filter(status__in=values)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将json反序列化为列表<Object>   Spring框架中的java回滚机制   java如何使反射在JDK 16及更高版本上工作?   java终结器如何导致可移植性问题?   java Hibernate使用ON子句或alternative左连接获取   java aws codebuild maven项目失败“保存的引用不明确”   并发Java多线程读取单个大文件   java如果输入仅由1和0组成,请将其从二进制转换为十进制   java在RealmRecyServiceAdapter上调用updateData实际上并没有更新数据   javajsf:h commandlink操作是打开同一页面的新弹出窗口,而不是调用bean方法   java我们可以为其中一个变量同时添加@Column和@OneToOne注释吗?   java JBoss AS 7自定义登录模块从未调用   如何检查Java中是否存在数组中的元素   java Spring重试:未调用带@Recover注释的方法   如何解析带有Java错误HTTP格式问题的php消息   java如何在weblogic中部署可选的包共享库   java将配置单元中的数据集保存为avro格式的合并列   用Guice注入java泛型   java单选按钮组和额外选项   javajackson:如何读取字符串作为列表?