口味阴性过滤器 [英] Tastypie Negation Filter

查看:147
本文介绍了口味阴性过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Is there a negation filter available by default. The idea is that you can do the following in the django ORM:

model.objects.filter(field!=value)

如果可以的话,我该怎么做?我试过:

How can I do that in tastypie if that is even possible. I tried:

someapi.com/resource/pk/?field__not=value
someapi.com/resource/pk/?field__!=value
someapi.com/resource/pk/?field!=value

所有这些都给我错误。

推荐答案

不幸的是没有。

问题是Tastypie的ModelResource类仅使用QuerySet的filter()方法,即不使用排除过滤器的exclude()。没有过滤器()字段查找,这意味着否定。有效的查找(在此之后 SO post ):

The problem is that Tastypie's ModelResource class uses the filter() method of the QuerySet only, i.e. it does not use exclude() which should be used for negative filters. There is no filter() field lookup that would mean negation though. The valid lookups are (after this SO post):

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分隔为过滤器。那么你应该通过第一个组来排除(),其余的通过过滤器()。

However it shouldn't be so hard to implement the support for something like "__not_eq". All you need to do is to modify the apply_filters() method and separate filters with "__not_eq" from the rest. Then you should pass the first group to exclude() and the rest to filter().

类似于:

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)

而不是默认值:

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)

应该允许以下语法:

someapi.com/resource/pk/?field__not_eq=value

我没有测试过,可能会以更优雅的方式写,但应该让你走: )

I haven't tested it. It could probably be written in more elegant way too, but should get you going :)

这篇关于口味阴性过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆