删除的许多会员一对多的关系Django的REST框架

问题描述:

鉴于以下系统删除的许多会员一对多的关系Django的REST框架

# 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 

基本上是一个玩家可以在许多球队

所以现在的问题是,如何实现端点管理球员 - 团队关系。 假设我们有两支球队与IDS 1和2 我创建

POST /播放/ {“名”:“PLAYER1”}玩家 本播放器将有编号1

我要添加玩家团队1和2,然后从队2

删除玩家有了这个设置,我可以做 PATCH /播放/ 1/{ '团队':[1,2]}

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

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

+0

http://*.com/questions/39343794/how-to-remove-an-object-from-manytomany-relationship-in-django-rest-framework – Fallen

我最喜欢解决这个问题的方法是在你的视图上为此创建一个细节路由端点。下面是一个例子:

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

    @detail_route(methods=['delete']) 
    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