15

Tastypie でのフィルタリングについて簡単な質問がありました。

複数の値でフィルタリングしたい。例えば:

/api/v1/message/?accountId=1,5,12

これは機能しません。どうすればこれを行うことができますか?

高度なフィルタリングを使用する必要がありますか? はいの場合、そのようなフィルターを作成するにはどうすればよいですか? puesdo-code の簡単な簡単な例は素晴らしいでしょう!

ありがとう!

4

5 に答える 5

19

うーん、

あなたはこれを行うことができます:

/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12

PS: メタ属性のフィルタリングで、追加{'accountId': ALL}

于 2012-07-11T16:52:11.687 に答える
9

フィルターを作成して適用する必要があります。これは小さなスニペットです。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()
于 2012-07-11T17:26:19.567 に答える
1

クラス Metaでフィルタリング列を宣言する必要があります。これはあいまいなルールによるセキュリティです。

したがって、accountId__in=[..]ルールはこれらの 1 つです。

``` filtering = { 'accountId' : ALL } OR filtering = { 'accountId' : [ ..., 'in' ] }

```

于 2014-03-19T17:11:38.050 に答える