2014-02-06 60 views
1

我正在使用Django-Tastypie構建RESTful API。我正在使用extra actions來執行更多操作。當我通過http_methodGET,我得到一個id場在某些情況下,我需要,但在一些我不要求它,因爲我想在某些部分和具體的過濾結果全部結果。在Django-Tastypie中使用extra_actions時,如何擺脫「id」參數?

所以,當我需要的所有成果,id參數應不應該存在。當我需要過濾結果時,它應該在那裏(它已經在那裏了)。所以,我的問題是如何在需要所有結果時刪除id字段?

這是寫有該

如果RESOURCE_TYPE被聲明爲「列表」則端點將不包括在URI或參數列表中的{id}參數。這適用於諸如以上示例的端點,用於過濾或執行跨多個項目的操作。如果省略resource_type並且http_method爲「GET」,那麼端點將默認爲「查看」,並在URI和參數列表中包含{id}參數。

但這是URI唯一的,但仍需要一個ID字段的情況下,即使我宣佈resouce_typelist

下面是屏幕截圖: -

當宣佈爲listresouce_type。看看URI中沒有{id}。但我希望在田裏不應該有id

When <code>resouce_type</code> declared as <code>list</code>

我怎麼能這樣做?

而且,我面對另一個問題。我有一個字段,通過ManyToManyField關係與另一個字段相關,這意味着我需要爲該字段提供一個值列表。但它不需要LIST,而是它本身需要一個字符串值。我已經上傳了自己的屏幕截圖。請讓我知道這個黑客。謝謝。

在這種情況下installation_id通過ManyToManyField有關。它顯示related,但我想它應該接受一個值列表(installation_id)。我怎樣才能做到這一點?

enter image description here

而且爲什麼並刪除沒有一個id?我的意思是它顯示id,但沒有輸入任何內容的字段。

enter image description here

+0

我現在沒有空閒時間,但我認爲這是我的代碼,所以我會在這個問題上出現並在幾個小時後回來。 –

+0

你可以發佈'extra_actions'字典嗎? –

+0

看起來你發現了一個錯誤!請參閱下面的答案,瞭解如何克隆回購並進行更改。我會在回購這個問題上開一個問題。 –

回答

0

的方式extra_actionslist VS view類型實行的是所有裏面mapping.py

這裏有兩個樣品extra_actions端點,一個描述了一種搜索視圖(list),另一個是用於與所需要的參數pk投標一個POST端點。

extra_actions = [ 
    { 
     "name": "search", 
     "http_method": "GET", 
     "resource_type": "list", 
     "summary": "Search item listings", 
     "response_class": "ListView", 
     "fields": { 
      "query": { 
       "description": "Search terms" 
      } 
     }, 
    }, 
    { 
     "name": "bid", 
     "http_method": "POST", 
     "resource_type": "view", 
     "summary": "Bid on an item listing", 
     "fields": { 
      "name": { 
       "description": "Bid on an item" 
      }, 
      "email": { 
       "description": "Bidder's email address" 
      }, 
      "comments": { 
       "description": "Notes or comments about the bid" 
      }, 
      "bid": { 
       "description": "Amount in USD or BTC" 
      } 
     } 
    } 
] 

出於兼容性原因extra_actions默認view作爲build_extra_operation作用下在mapping.py看出。該參數是從下面build_parameters_from_extra_action複製內置:

def build_parameters_from_extra_action(self, method, fields, resource_type): 
    parameters = [] 
    if method.upper() == 'GET' or resource_type == "view": 
     parameters.append(self.build_parameter(paramType='path', 
      name=self._detail_uri_name(), 
      dataType='int', 
      description='ID of resource')) 
    for name, field in fields.items(): 
     parameters.append(self.build_parameter(
      paramType="query", 
      name=name, 
      dataType=field.get("type", "string"), 
      required=field.get("required", True), 
      description=force_unicode(field.get("description", "")), 
     )) 

    return parameters 

認爲有這個問題,因爲我做的時候。支票是if method.upper() == 'GET' or resource_type == "view":而不是if method.upper() == 'GET' and resource_type == "view":或更短,可能更正確if resource_type == "view":

我建議克隆repo的副本並在本地進行此修改。我會經歷一下,看看檢查修改會破壞什麼。我注意到id參數也在我的視圖中顯示。

+0

我會試着看看能做些什麼。與此同時,如果您(或我)發現黑客可以通過此操作,請將其發佈到此處或其他地方。謝謝 – PythonEnthusiast

+0

另外,我正面臨另一個問題。我有一個字段通過'ManyToManyField'關係與另一個字段相關,這意味着我需要爲該字段提供一個值列表。但它不需要LIST,而是它本身需要一個字符串值。我已經上傳了自己的屏幕截圖。請讓我知道這個黑客。謝謝。 – PythonEnthusiast