【发布时间】:2012-07-11 06:46:16
【问题描述】:
我有一个关于在美味派中过滤的简单问题。
我想过滤多个值。例如:
/api/v1/message/?accountId=1,5,12
这不起作用。知道我该怎么做吗?
我需要使用高级过滤吗?如果是,我该如何创建这样的过滤器?一个简单的 puesdo 代码示例会很棒!
谢谢!
【问题讨论】:
我有一个关于在美味派中过滤的简单问题。
我想过滤多个值。例如:
/api/v1/message/?accountId=1,5,12
这不起作用。知道我该怎么做吗?
我需要使用高级过滤吗?如果是,我该如何创建这样的过滤器?一个简单的 puesdo 代码示例会很棒!
谢谢!
【问题讨论】:
嗯,
你可以这样做:
/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
PS:在过滤元属性中,添加{'accountId': ALL}
【讨论】:
accountId 并忽略第二个。也许行为已经改变。 wobbily_col 下面的回答非常适合我。
最新版本似乎很容易工作 - 只需使用“__in”:
/api/v1/message/?accountId__in=1,5,12
(我假设您需要在资源 Meta 类中添加一个条目,filtering = { 'accountId' : ALL })
【讨论】:
您必须构建并应用过滤器。这是一个小sn-p,最好在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()
【讨论】:
/api/v1/message/?accountId__in=1,5,12
这对我来说是正确的方法,它简单明了。
/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
这种方式很奇怪,看起来很丑。
当然,你需要在资源META中添加filtering = { 'accountId' : ALL }。
【讨论】:
您必须在 class Meta 中声明 filtering 列。这是一个默默无闻的安全规则。
因此,accountId__in=[..] 规则就是其中之一。
``` 过滤 = { 'accountId' : ALL } 要么 过滤 = { 'accountId' : [ ..., 'in' ] }
```
【讨论】: