2012-07-11 100 views
15

我有一個簡單的問題在tastypie過濾。Tasteypie過濾與多個值

我想過濾多個值。例如:

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

這行不通。任何想法如何我可以做到這一點?

我需要使用高級過濾嗎?如果是的話,我該如何去創建這樣一個過濾器?一個簡單易用的puesdo代碼示例非常棒!

謝謝!

回答

19

嗯,

你可以這樣做:

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

PS:在過濾元屬性,添加{'accountId': ALL}

+0

感謝這工作:)但它會使網址真的很長。有沒有辦法我可以做得更整齊,以防萬一我需要篩選許多帳戶id? – nknj 2012-07-11 20:44:19

+0

簽出'prepend_urls()' – 2013-02-11 23:24:07

+0

這不覆蓋以前的GET參數嗎? – Amyth 2013-05-22 13:25:51

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() 
+0

感謝您的幫助。我很難理解這將如何工作。是否還有更多這樣的內容:http://django-tastypie.readthedocs.org/en/latest/resources.html#advanced-filtering在tastypie文檔中對此有所幫助? – nknj 2012-07-11 20:46:18

8

最新版本似乎很輕鬆地工作 - 只需使用一個「__in」 :

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

(我假設你需要在你的資源類的Meta中的條目,過濾= { '帳戶ID':ALL})

0

您必須類聲明過濾列元。這是一個安全通過默默無聞規則。

因此,accountId__in = [..]規則就是其中之一。

``` 濾波= { '的accountId':ALL} OR 濾波= { '的accountId':[..., '在']}

```

1

/api/v1/message/?accountId__in=1,5,12
這是對我來說正確的方式,它很簡單直接。

/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
這種方式很奇怪,看起來很醜。

當然,您需要在資源META中添加filtering = { 'accountId' : ALL }