Tastypie 否定过滤器 [英] Tastypie Negation Filter

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

问题描述

默认情况下是否有可用的否定过滤器.这个想法是你可以在 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() .没有 filter() 字段查找意味着否定.有效的查找是(在此之后 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"的过滤器与其他过滤器分开.然后你应该将第一组传递给 exclude(),其余的传递给 filter().

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 :)

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

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