【问题标题】:Delete Member of Many To Many Relationship Django Rest Framework删除多对多关系Django Rest框架的成员
【发布时间】:2017-06-28 19:22:36
【问题描述】:

给定以下系统

#  Models
class Team(models.Model):
    name = models.CharField(max_length=128)


class Player(models.Model):
    name = models.CharField(max_length=128)
    teams = models.ManyToManyField(Team)

#  Serializers
class PlayerSerializer(serializers.ModelSerializer):
    teams = serializers.PrimaryKeyRelatedField(many=True, queryset=League.objects.all(), required=False)

    class Meta:
        model = Team
        fields = ('id', 'name', 'teams')

# Views
class TeamViewSet(viewsets.ModelViewSet):
    queryset = Team.objects.all()
    serializer_class = TeamSerializer

基本上一个球员可以加入许多球队

所以问题是,我如何实现端点来管理玩家与团队的关系。 假设我们有两个 ID 为 1 和 2 的团队 我用

创建了一个播放器

POST /players/ {'name': 'player1'} 该玩家的 ID 为 1

我想将玩家添加到团队 1 和 2,然后从团队 2 中移除玩家

有了这个设置,我可以做到 PATCH /players/1/ {'teams': [1, 2]}

我现在如何从团队 2 中移除 player1?

另外,使用补丁请求将 player1 添加到团队 1 和 2 是否正确?

【问题讨论】:

标签: python django django-rest-framework manytomanyfield


【解决方案1】:

我最喜欢解决这个问题的方法是在您为此制作的视图集上创建一个详细路由端点。下面是一个示例:

# Views
class TeamViewSet(viewsets.ModelViewSet):
    queryset = Team.objects.all()
    serializer_class = TeamSerializer

    @action(methods=['delete'], detail=True)
    def remove_players_from_team(self, request):
        team = self.get_object()
        players_to_remove = request.data['players']
        # ...

从那里,您可以添加逻辑以从团队中移除玩家。端点将类似于:<base_url>/api/teams/<team_id>/remove_players_from_team 并期望参数 players 和请求类型为 DELETE,您可以期望有多种方式。

这也可以应用于添加玩家,如果需要,可以应用于反向关系。

至于允许使用哪种方法,请考虑正在做的事情。如果要添加玩家,请首选POST 请求。如果要删除它们,请选择DELETE。如果您希望它们被视为更新,请使用PATCH

如果你有兴趣使用它,check out the DRF documentation

【讨论】:

  • 您提供了一个指向 DRF 文档的链接,其中 detail_route 由于 action 装饰器而被弃用。
  • @Marek 感谢您的编辑!我已更新文档链接以反映您的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2020-06-15
  • 2015-08-22
  • 2017-06-23
  • 2016-12-22
相关资源
最近更新 更多