如何在Django Rest Framework中添加批量删除id

wyyhbhjk  于 2023-05-01  发布在  Go
关注(0)|答案(1)|浏览(202)

我试图在我的Django REST框架项目中添加批量删除,但被卡在视图中。py有人知道如何在我的项目中实现此功能吗?
这是我在www.example上的课 www.example.com :

class AssignmentViewSet(viewsets.ModelViewSet):
    """View for manage assignment APIs."""
    serializer_class = serializers.AssignmentSerializer
    queryset = Assgnment.objects.all()
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        """Retrieve recipes for authenticated user."""
        return self.queryset.filter(user=self.request.user).order_by('-id')
    

    def get_serializer_class(self):
        """Return the serializer class for request."""
        if self.action == 'list':
            return serializers.AssignmentSerializer

        return self.serializer_class
    

    def perform_create(self, serializer):
        """Create a Assignment."""
        serializer.save(user=self.request.user)

以下是我的URL:

from rest_framework.routers import DefaultRouter

from assignment import views

router = DefaultRouter()
router.register('assignment', views.AssignmentViewSet)
router.register('tags', views.TagViewSet)

app_name = 'assignment'

urlpatterns = [
    path('', include(router.urls)),
]

请让我知道,如果你需要更多的细节,我的项目
更新***
我尝试了这个方法,但没有工作:

class AssignmentViewSet(viewsets.ModelViewSet):
    # ... existing code ...

    @action(detail=False, methods=['delete'])
    def delete_bulk(self, request):
        """Delete multiple assignments by ids."""
        assignment_ids = request.data.get('ids', [])
        self.queryset.filter(user=self.request.user, id__in=assignment_ids).delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

我的API有效负载:

curl -X 'DELETE' \
  'http://127.0.0.1:8000/api/assignment/assignment/delete_bulk?ids=8,9' \
  -H 'accept: */*' \
  -H 'Authorization: Token 1376bfc2439f1347ab16b28fb9e83b83a4336984' \
  -H 'X-CSRFTOKEN: x5CfIVresmUTbpG5GlPKAthmZ26WrWv3R5W0etOuhMm5Tbs0skwJMhxDFsT1KxKB'
uyhoqukh

uyhoqukh1#

如果需要从query_params获取数据:

data = request.query_params.get("id")

但在您的情况下,更好的方法是在体和序列化程序中处理。在你的序列化器中。py**:

class DeleteAssignmentSerializer(serializers.Serializer):
    ids = serializers.ListField(child=serializers.IntegerField())

在你的眼中py执行如下操作:

class AssignmentViewSet(viewsets.ModelViewSet):
    # ... existing code ...

    @action(detail=False, methods=['delete'])
    def delete_bulk(self, request):
        """Delete multiple assignments by ids."""
        serializer = DeleteAssignmentSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        ids = serializer.data
        self.queryset.filter(user=self.request.user, id__in=ids).delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

相关问题