2015-11-16 37 views
1

我在聯繫人和聯繫人組之間有多對多的關係。一個聯繫人可以屬於多個組,一個組可以包含多個聯繫人。在djangorestframework中處理可寫入的M2M關係的正確方法是什麼?

我希望能夠顯示這樣的數據,所以當顯示用戶所屬組的名稱時,我不需要執行多個查詢。

GET 
{ 
    "id": 1, 
    "name": "Gandalf", 
    "groups": [ 
    { 
     "id": 3, 
     "name": "Lord of the rings" 
    } 
    ] 
} 

但是,如果我更新,我希望能夠使用ID或URL例如更新

POST 
{ 
    "id": 1, 
    "name": "Gandalf", 
    "groups": [ 
    [2] 
    ] 
} 

這將第3組中刪除它,並把它放到第2組代替。我知道我應該寫一個Writable nested serializer,但我有兩個問題:

1)我想正確地做到這一點,當我想要做到這一點時,應該是一個很好的做法。我將發送ID或整個對象,如

POST 
{ 
    "id": 1, 
    "name": "Gandalf", 
    "groups": [ 
    { 
     "id": 2, 
     "name": "Wizards" 
    } 
    ] 
} 

這一個似乎有點怪我,因爲我需要(在這種情況下名字)發送不需要的信息。

2)如果我可以使用id/url原則,我該怎麼做?在自定義create/update方法,我的ID不能確認,因爲串行指向GroupSerializer並且不接受int類型,它預計GroupSerializer,所以訪問validated_data.get('groups')不會讓我的ID,它會告訴我[{"non_field_errors":["Invalid data. Expected a dictionary, but got int."]}]}

我可以寫2個串行器 - 一個用於創建/更新,另一個用於顯示數據。你認爲這是一個正確的方法嗎?我是否正確地思考呢?你對這種方法有什麼看法?

回答

0

對於#1,您可以將該名稱保留爲只讀字段,在這種情況下,您將讀取該字段並將其寫入操作中將其丟棄。

#2,你要保持一致,你最好把它送:

POST 
{ 
    "id": 1, 
    "name": "Gandalf", 
    "groups": [ 
    {"id": 2} 
    ] 
} 

你真的不希望有讀出不同的風格和寫入操作,真的。

相關問題