我对tastypie中的过滤有一个简单的问题。
我想过滤多个值。例如:
/api/v1/message/?accountId=1,5,12
这不起作用。知道我怎么能这样做吗?
我需要使用高级过滤吗?如果是,我该如何创建这样的过滤器?一个简单的puesdo-code的简单例子就会很棒!
谢谢!
答案 0 :(得分:19)
嗯,
你可以这样做:
/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
PS:在过滤元属性时,添加{'accountId': ALL}
答案 1 :(得分:9)
最新版本似乎非常容易 - 只需使用“__in”:
/api/v1/message/?accountId__in=1,5,12
(我假设你的资源Meta类需要一个条目,filtering = {'accountId':ALL})
答案 2 :(得分:8)
您必须构建并应用过滤器。这是一个小片段,最好在build_filters中构建过滤器,然后将其应用于apply_filters,但你会明白这个想法
class Foo(ModelResource):
# regular stuff goes here...
def apply_filters(self, request, applicable_filters):
base_object_list = super(Foo, self).apply_filters(request, applicable_filters)
query = request.GET.get('query', None)
ids = request.GET.get('ids', None)
filters = {}
if ids:
ids = ids.replace('+', ' ').split(' ')
filters.update(dict(id__in=ids))
if query:
qset = (
Q(title__icontains=query, **filters) |
Q(description__icontains=query, **filters)
)
base_object_list = base_object_list.filter(qset).distinct()
return base_object_list.filter(**filters).distinct()
答案 3 :(得分:2)
/api/v1/message/?accountId__in=1,5,12
这对我来说是正确的方式,它简单直接。
/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
这种方式很奇怪,看起来很难看。
当然,您需要在资源META中添加filtering = { 'accountId' : ALL }
。
答案 4 :(得分:1)
您必须在类Meta 中声明过滤列。这是一个安全隐藏规则。
因此, accountId__in = [..] 规则就是其中之一。
``` filtering = {'accountId':ALL} 要么 filtering = {'accountId':[...,'in']}
```