给定以下系统
# 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 .
