给定以下系统

#  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中删除玩家

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

现在如何从团队2中删除玩家1?

另外,使用补丁请求将玩家1添加到团队1和2是正确的方法吗?

最佳答案

对于此问题,我最喜欢的方法是在为此设置的视图集上创建详细路径端点。这是一个看起来像的例子:

# 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

关于python - 删除多对多关系成员Django Rest Framework,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42159480/

10-12 17:36
查看更多