2017-10-05 56 views
0

可以說我在Django中有兩個模型,我使用標準的Viewset和Serializer來公開端點。Django Rest Framework - 選項請求 - 獲得外鍵選擇

ModelA具有ModelB的ForeignKey字段。當我做一個OPTIONS請求MODELA終點,它只是將其列爲一個領域,象下面這樣:

"actions": { 
    "POST": { 
     "pk": { 
      "type": "integer", 
      "required": false, 
      "read_only": true, 
      "label": "ID" 
     }, 
     "created": { 
      "type": "datetime", 
      "required": false, 
      "read_only": true, 
      "label": "Created" 
     }, 

     "foreign_key_field": { 
      "type": "field", 
      "required": true, 
      "read_only": false, 
      "label": "Wcp" 
     }, 
    } 
} 

我想它有一個「選擇」屬性,它拉低模式B.這每一個單一實例在我的Angular前端中,我可以創建所有選項的下拉列表。

我想我需要做一個新的MetaData類或somthing。但我找不到任何可行的方法。我也認爲這個功能已經在DRF的3.X中發生了變化,所以互聯網上的舊回答不再有幫助。

乾杯, 院長

回答

0

我沒有一個完美的答案爲好,但我的實現,這是映射JSON項目的ID和存儲這樣的集合像這樣(在角)的方式:

$scope.nodes = response.data; //original data retrieved from django 
$scope.nodesIds = response.data.map(function (v) { return v.id; }); //particular ids 

這樣做,你可以使用在NG-選項地圖以這樣的方式:

<select ng-model="node_start" ng-options="node for node in nodesIds" /> 

更好的想法?

//經過深思熟慮(事實證明,這是一個「手動」方式)

from rest_framework.metadata import SimpleMetadata 
class MyMetadata(SimpleMetadata): 
    def get_serializer_info(self, serializer): 
     orderedDict = super().get_serializer_info(serializer) 
     orderedDict['foreign_key_field']['choices'] = [x.id for x in Node.objects.all()] 
     return orderedDict 

class ViewSet(ModelViewSet): 
    metadata_class = MyMetadata 

請讓我知道它是否適合你:)

//最後(聰明的做法在默認情況下DRF代碼更改)

如果全自動想要的話,你需要做的就是增加三行代碼metadata.py:在上面

from rest_framework.relations import PrimaryKeyRelatedField 
在get_field_info方法

if type(field) is PrimaryKeyRelatedField: 
    field_info['choices'] = [x.id for x in field.queryset.all()] 
+0

嗯,我打算對事物的Django的側解決的事情。我知道我需要對DRF進行一些更改 - 可能是處理選項請求的元數據類 –

+0

不簡單ng-options =「node.id as node.id for node in nodes」滿足您的需求嗎?也許有些東西我不清楚,但我不明白爲什麼不用他們的ID存儲forein鍵? – detoix

+0

我正在使用Angular 4,並且與DRF如何處理選項無關。 –