给定以下系统
# 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 中删除玩家
通过这种设置,我可以做到补丁/玩家/1/{'团队': [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
。
如果您有兴趣使用它,请查看 DRF 文档。