对于RESTful API,如何创建多对多关系

时间:2018-07-27 03:41:35

标签: rest django-rest-framework

有两个实体(Club和User),以及它们的表现表(ClubUser)。

  • 俱乐部
    • id
    • 名称
  • 用户
    • id
    • 名称
  • ClubUser
    • club_id
    • user_id

现在,当我们为POST / clubs创建一个俱乐部时,我们想要创建多个ClubUsers。什么是有害生物做法?

我可以找到这三种解决方案。

  1. 请求一次

请求网址:/clubs

请求方法:POST

请求正文:

{
  name: 'club name',
  users: [
    {
       id: 1
    },
    {
       id: 2
    }
  ]
}

  1. 请求两次

Request1网址:/clubs

Request1方法:POST

Request1正文:

{
  name: 'club name'
}

Request2网址:/clubs/1/users

Request2方法:POST

Request2正文:

[
  {
     user_id: 1
  },
  {
     user_id: 2
  }
]

  1. 多次请求

Request1网址:/clubs

Request1方法:POST

Request1正文:

{
  name: 'club name'
}

Request2网址:/clubs/1/users/1

Request2方法:POST

Request3网址:/clubs/1/users/2

Request3方法:POST


第三个看起来不错,但是它多次请求。

此问题的最佳实践是什么?

1 个答案:

答案 0 :(得分:0)

尝试一下:

  

模型

from django.db.models import (
    Model, ManyToManyField
)
class User(Model):
    club = ManyToManyField(Club)
  

序列化器

from rest_framework.serializers import (
    ModelSerializer, IntegerField, RelatedField
)
class ClubRelatedField(RelatedField):
    def to_representation(self, obj):
        data = {
            'id': obj.id,
            'name': obj.name
        }
        return data

    def to_internal_value(self, id):
        return Club.objects.get(id=id)

class UserSerializer(ModelSerializer):
    id = IntegerField(read_only=True)
    club = ClubRelatedField(
        queryset=Club.objects.all(), many=True, required=True
    )