2015-12-14 97 views
3

在我的模型中,我有「狀態」和「國家/地區」。一個國家可以有許多國家。Django REST框架:動態序列化關係字段 - POST pk但GET超鏈接

HTTP GET與PK 1狀態:

{ 
    "id": 1, 
    "url": "http://test.com/states/1/", 
    "name": "Ohio", 
    "country": "http://test.com/countries/2/" 
} 

我喜歡在表示返回一個超鏈接相關的字段爲國家的上方。但是,它強制我在更新狀態時POST超鏈接URL,這對客戶端來說可能很麻煩。我寧願只發布該國的主鍵,就像這樣:

HTTP PUT/POST:

{ 
    "id": 1, 
    "url": "http://test.com/states/1/", 
    "name": "Ohio", 
    "country": 2 
} 

有一種優雅的方式來做到這一點?

僅供參考,這裏有其他成分:

Models.py

class State(models.Model): 
    name = models.TextField() 
    country = models.ForeignKey(Country, related_name='states', null=True) 

class Country(models.Model): 
    name = models.TextField() 

Views.py

class StateViewSet(ExpandModelViewSet): 
    queryset = State.objects.all() 
    serializer_class = StateSerializer 

class CountryViewSet(ExpandModelViewSet): 
    queryset = Country.objects.all() 
    serializer_class = CountrySerializer 

Serializers.py

class StateSerializer(ExpandModelSerializer): 

    country = serializers.HyperlinkedRelatedField(view_name='country-detail', queryset=Country.objects.all(), allow_null=True) 

    class Meta: 
     model = State 
     fields = ('id', 'url', 'name', 'country') 


class CountrySerializer(ExpandModelSerializer): 

    class Meta: 
     model = Country 
     fields = ['id', 'url', 'name'] 
+0

您可以添加視圖的代碼嗎? – Newtt

回答

0

你必須設置簡單隻讀到真正read_only=True,他不答應你插入整個鏈路,只需ID就足夠了:

class StateSerializer(ExpandModelSerializer): 

    country = serializers.HyperlinkedRelatedField(read_only=True, view_name='country-detail', queryset=Country.objects.all(), allow_null=True) 

    class Meta: 
     model = State 
     fields = ('id', 'url', 'name', 'country') 

,並在您的數據發送country_id密鑰而不是country

+0

這似乎沒有工作。當我POST或PUT與「國家」屬性設置爲一個整數,沒有反應 –

+0

你應該發送關鍵country_id – DhiaTN

+0

啊,這是有道理的。但是,這看起來不太優雅,而不是讓客戶與單個屬性名稱進行交互? –

相關問題