2016-09-01 40 views
2

我對django和django-rest-framework很新,但我試圖將列表傳遞給url參數,然後通過它們過濾我的模型。django-rest-framework:在URL中列出參數

比方說客戶端應用程序發送,看起來像這樣的請求......

url: "api.com/?something=string,string2,string3&?subthings=sub,sub2,sub3&?year=2014,2015,2016/" 

我想在這些參數「東西」通過,「subthings」,並與他們的價值觀「年」 。

這裏的url看起來像這樣?

注:特技是它不會總是每個參數長度爲3的數組。

有人可以指出我的正確方向:我的url正則表達式應該如何處理列表以及在我的視圖中檢索查詢列表。

謝謝!

+0

正確的方向http://www.django-rest-framework.org/api-guide/filtering/ – glmvrml

回答

2

驗證,以顯示我是如何做到這多虧了上面的文檔鏈接。 注意:我使用管道作爲我的url分隔符,而不是逗號 - >'|'。

在我urls.py

url(r'^$', SomethingAPIView.as_view(), name='something'), 

views.py

class SomethingAPIView(ListAPIView): 
    # whatever serializer class 

    def get_queryset(self): 
    query_params = self.request.query_params 
    somethings = query_params.get('something', None) 
    subthings = query_params.get('subthing', None) 
    years = query_params.get('year', None) 

    # create an empty list for parameters to be filters by 
    somethingParams = [] 
    subthingsParams = [] 
    yearParams = [] 

    # create the list based on the query parameters 
    if somethings is not None: 
     for something in somethings.split('|'): 
     countryParams.append(int(something)) 
    if subthings is not None: 
     for subthing in subthings.split('|'): 
     subthingsParams.append(int(subthing)) 
    if years is not None: 
     for year in years.split('|'): 
     yearParams.append(int(year)) 

    if somethings and subthings and years is not None: 
     queryset_list = Model.objects.all() 
     queryset_list = queryset_list.filter(something_id__in=countryParams) 
     queryset_list = queryset_list.filter(subthing_id__in=subthingsParams) 
     queryset_list = queryset_list.filter(year__in=yearParams) 
     return queryset_list 

我需要檢查一個空的結果,如果他們是無效的。但是,對於希望在查詢參數中傳遞多個值的人來說,這是一個起點。

這裏有效的網址是/?something=1|2|3&subthing=4|5|6&year=2015|2016