亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 90 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號