首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Tastypie否定滤波器

Tastypie否定滤波器
EN

Stack Overflow用户
提问于 2012-03-13 05:33:21
回答 5查看 6.5K关注 0票数 19

默认情况下是否有可用的否定过滤器。我们的想法是,您可以在django ORM中执行以下操作:

代码语言:javascript
复制
model.objects.filter(field!=value)

如果这是可能的,我怎么能在tastypie中做到这一点呢?我试过了:

代码语言:javascript
复制
someapi.com/resource/pk/?field__not=value
someapi.com/resource/pk/?field__!=value
someapi.com/resource/pk/?field!=value

他们都给了我错误。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-17 05:13:43

不幸的是没有。

问题是Tastypie的ModelResource类只使用QuerySet的filter()方法,也就是说,它没有使用应该用于负面滤镜的exclude()。不过,没有filter()字段查找会导致求反。有效的查找是(在此SO post之后):

代码语言:javascript
复制
exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range
year
month
day
week_day
isnull
search
regex
iregex

然而,实现对"__not_eq“之类的东西的支持应该不是那么难。您所需要做的就是修改apply_filters()方法,并用"__not_eq“将过滤器与其他过滤器分开。然后,您应该将第一个group传递给exclude(),将其余的传递给filter()。

类似于:

代码语言:javascript
复制
def apply_filters(self, request, applicable_filters):
    """
    An ORM-specific implementation of ``apply_filters``.

    The default simply applies the ``applicable_filters`` as ``**kwargs``,
    but should make it possible to do more advanced things.
    """
    positive_filters = {}
    negative_filters = {}
    for lookup in applicable_filters.keys():
        if lookup.endswith( '__not_eq' ):
            negative_filters[ lookup ] = applicable_filters[ lookup ]
        else:
            positive_filters[ lookup ] = applicable_filters[ lookup ]

    return self.get_object_list(request).filter(**positive_filters).exclude(**negative_filters)

而不是默认的:

代码语言:javascript
复制
def apply_filters(self, request, applicable_filters):
    """
    An ORM-specific implementation of ``apply_filters``.

    The default simply applies the ``applicable_filters`` as ``**kwargs``,
    but should make it possible to do more advanced things.
    """
    return self.get_object_list(request).filter(**applicable_filters)

应支持以下语法:

代码语言:javascript
复制
someapi.com/resource/pk/?field__not_eq=value

我还没有测试过。它可能也可以以更优雅的方式编写,但应该能让您上手:)

票数 28
EN

Stack Overflow用户

发布于 2013-09-26 07:32:31

另一种不需要更改代码的方法是将iregex与inverse matching结合使用

代码语言:javascript
复制
http://HOST/api/v1/resource/?format=json&thing__iregex=^((?!notThis).)*$
票数 6
EN

Stack Overflow用户

发布于 2012-06-13 22:04:32

我已经为此打开了一个bug,并在这里提供了一个简单的解决方案:https://github.com/toastdriven/django-tastypie/issues/524

添加“!”可能更好。字段名称末尾的字符,如您在问题中所做的那样...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9675127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档