在djangorestframework中处理可写M2M关系的正确方法是什么?

时间:2015-11-16 17:52:14

标签: django serialization django-rest-framework

我在Contact和ContactGroup之间有很多关系。一个联系人可以属于多个组,一个组可以包含多个联系人。

我希望能够显示这样的数据,因此在显示用户所属的群组名称时,我不需要进行多次查询。

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类型,它预计{{1因此,访问GroupSerializer无法获取ID,它会告诉我validated_data.get('groups')

我可以编写2个序列化程序 - 一个用于创建/更新,另一个用于显示数据。你认为这是一个正确的方法吗?我在第一时间做了正确的思考吗?您如何看待这种方法?

1 个答案:

答案 0 :(得分:0)

对于#1,您可以将该名称保留为只读字段,在这种情况下,您可以将其用于读取,并且它将被丢弃以进行写入操作。

对于#2,因为你想保持一致,你最好把它发送:

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

你真的不想为读写操作设置不同的风格。