我正在使用 Django Rest Framework 开发一个类似 Trello 的网站。我想将选定的用户添加到模型中,一个模型和模型BoardAccess的直通表,其中两个是多对多关系。被添加到表中意味着相应的用户将可以访问匹配的板。UserBoardBoardAccess
模型.py
class Board(models.Model):
name = models.CharField(max_length=50)
access_granted = models.ManyToManyField(User, through='BoardAccess', related_name='access_boards')
team = models.ForeignKey(Team, on_delete=models.CASCADE) # a team can have many boards
class BoardAccess(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
board = models.ForeignKey('Board', on_delete=models.CASCADE)
对于用户,我目前正在使用 Django 的默认 Auth User 模型,并通过 OneToOne 字段使用 Profile 模型对其进行扩展。
序列化程序.py
class BoardAccessSerializer(serializers.ModelSerializer):
members = serializers.SerializerMethodField()
added_users = # ???
new_name = serializers.CharField(
write_only=True, required=False, source='name') # in case of requests for renaming the board
def get_members(self, instance):
members = User.objects.filter(profile__team=instance.team)
return UserBoardSerializer(members, many=True).data
我想知道应该分配什么字段/关系/另一个序列化程序added_users,我认为应该是这样write_only=True,以便成功地反序列化来自客户端的输入,其中包含选定用户的主键。
get_members()方法用于首先显示所有团队成员的信息,客户端将从中选择要添加到董事会的用户。
视图.py
class BoardAccessRetrieveUpdateAPIView(generics.RetrieveUpdateAPIView):
serializer_class = BoardAccessSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
team_id = self.kwargs.get('team_id')
team = get_object_or_404(Team, id=team_id)
queryset = Board.objects.select_related(
'team').prefetch_related(
'access_granted').filter(team=team)
return queryset
我是DRF的新手,所以从上面可能有很多需要改进的地方。我真的很感激每一个帮助!