Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Djangorest框架中处理可写M2M关系的正确方法是什么?_Django_Serialization_Django Rest Framework - Fatal编程技术网

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

在Djangorest框架中处理可写M2M关系的正确方法是什么?,django,serialization,django-rest-framework,Django,Serialization,Django Rest Framework,我在联系人和联系人组之间存在多对多关系。一个联系人可以属于多个组,一个组可以包含多个联系人 我希望能够像这样显示数据,所以在显示用户所属组的名称时,不需要进行多次查询 GET { "id": 1, "name": "Gandalf", "groups": [ { "id": 3, "name": "Lord of the rings" } ] } 但如果我更新,我希望能够使用ID或URL更新,例如 POST { "id": 1,

我在联系人和联系人组之间存在多对多关系。一个联系人可以属于多个组,一个组可以包含多个联系人

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

GET
{
  "id": 1,
  "name": "Gandalf",
  "groups": [
     {
      "id": 3,
      "name": "Lord of the rings"
     }
  ]
}
但如果我更新,我希望能够使用ID或URL更新,例如

POST
{
  "id": 1,
  "name": "Gandalf",
  "groups": [
     [2]
  ]
}
这将把它从第3组中移除,然后放到第2组。我知道我应该写一封信,但我有两个问题:

1) 我想正确地做这件事,当我想做这件事的时候,什么应该是一个好的实践。我应该发送ID还是整个对象,比如

POST
{
  "id": 1,
  "name": "Gandalf",
  "groups": [
     {
      "id": 2,
      "name": "Wizards"
     }
  ]
}
这个对我来说似乎有点奇怪,因为我需要发送不需要的信息(本例中的名称)

2) 如果我能遵循id/url原则,我该如何做?在自定义
create/update
方法中,我无法验证id,因为序列化程序指向
GroupSerializer
并且不接受
int
类型,它需要
GroupSerializer
,因此访问
验证的\u数据。get('groups')
不会获取id,它会告诉我
[{“非\u字段\u错误”:[无效数据。应为字典,但得到int.“]}]}

我可以编写两个序列化程序,一个用于创建/更新,另一个用于显示数据。你认为这是一种正确的方法吗?我的想法是否正确?你认为这种方法如何?

对于#1,你可以将名称保留为只读字段,在这种情况下,你将其用于读取,并将其用于写入操作

对于#2,由于您希望保持一致性,最好将其发送:

POST
{
  "id": 1,
  "name": "Gandalf",
  "groups": [
    {"id": 2}
  ]
}
您真的不想为读写操作使用不同的样式。

对于#1,您可以将名称保留为只读字段,在这种情况下,您可以将其用于读操作,而将其用于写操作

对于#2,由于您希望保持一致性,最好将其发送:

POST
{
  "id": 1,
  "name": "Gandalf",
  "groups": [
    {"id": 2}
  ]
}
你真的不希望读写操作有不同的风格,真的