Skip to main content
 首页 » 编程设计

python之删除多对多关系的成员 Django Rest Framework

2025年02月15日27kenshinobiy

给定以下系统

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

另外,使用补丁请求将 player1 添加到团队 1 和 2 是执行此操作的正确方法吗?

请您参考如下方法:

我最喜欢的解决这个问题的方法是在为此制作的 View 集上创建一个详细的路线端点。这是一个可能看起来如何的示例:

# 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 .