为了账号安全,请及时绑定邮箱和手机立即绑定

Django Rest Framework:使用新路由更新子对象,而不是部分更新模型

Django Rest Framework:使用新路由更新子对象,而不是部分更新模型

繁花不似锦 2022-06-14 10:17:19
我正在尝试创建一个 API 对象 Roster,它有一个成员列表作为子对象。但是,我不想通过部分更新名册对象来更新子对象——相反,我想要“添加成员”和“删除成员”的路由。目标:GET /Roster/{ROSTERID}回复正文:{    id: {roster id},    members: # members sub object is read only      [        {member subobject},        {member subobject},         ...      ],}POST /Roster/{RosterID}/AddMember{    {member id},    {member id}, ...}然后是删除成员的类似操作。注意:我希望能够传入现有的成员 ID。我不想在这里创建新成员。我应该在文档中寻找什么才能添加路由来使用用户 ID 更新成员列表,而不必传入整个用户对象?serializers.pyclass UserSerializer(serializers.ModelSerializer):    class Meta:        model = User        fields = ['url', 'username', 'email', 'groups']class RosterSerializer(serializers.ModelSerializer):    members = serializers.ListField(        child=UserSerializer()    )    class Meta:        model = Roster        fields = ('id', 'name', 'members')        depth = 2app/models.pyclass Members(User):    on_pto = models.BooleanField(default=False)class Roster(models.Model):    objects = models.Manager()    name = models.CharField(max_length=80, blank=True, default='', unique=True, null='')    members = models.ForeignKey(        Members,        limit_choices_to={'on_pto': False},        blank=True,        null=True,        related_name='members',        on_delete=models.CASCADE    )views.pyclass UserViewSet(viewsets.ModelViewSet):    """    API endpoint that allows users to be viewed or edited.    """    queryset = User.objects.all().order_by('-date_joined')    serializer_class = UserSerializerclass GroupViewSet(viewsets.ModelViewSet):    """    API endpoint that allows groups to be viewed or edited.    """    queryset = Group.objects.all().order_by('-id')    serializer_class = GroupSerializerclass RosterViewSet(viewsets.ModelViewSet):    """"""    queryset = Roster.objects.all().order_by('-id')    serializer_class = RosterSerializer
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

您可能需要更改模型以允许 roster 有多个成员,或者为 roster 执行多对多或将 FK 关系放在用户身上。因此,您可以为一个名册添加多个成员。


为此,您可以使用这样的自定义路线。下面显示 add_member 和 remove_member 类似,修改为从 members_set 中删除名册对象。


class RosterViewSet(viewsets.ModelViewSet):


    queryset = Roster.objects.all().order_by('-id')

    serializer_class = RosterSerializer


    @action(detail=True, methods=['post'])

    def add_member(self, request, pk=None):

        errors = []

        response = {}

        roster = self.get_object()

        members_dict = request.data['members']

        if not isinstance(members_dict, list):

            errors.append("Invalid request format")

        else:

            for id in members_dict:

                try:

                    member = User.objects.get(pk=id)

                    roster.members.add(member)

                    roster.save()

                    status_code = status.HTTP_200_OK

                except Member.DoesNotExist:

                    errors.append("Member id {} not found".format(id))

         if errors:

            response['errors'] = errors

            status_code = status.HTTP_400_BAD_REQUEST


    return response.Response(response, status=status_code)


查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信