Django rest framework,使用UUID作为id时为空request.data

2024-04-28 21:14:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个API,它允许用户删除属于某个特定工作区的项目

我曾经用这个JSON作为数据调用这个URL,它工作得很好

网址:

.../my_api/workspaces/[workspace_id]/projects

JSON:

{
    "id": [project_id_to_remove]
}

但是,由于我已将默认生成的id替换为models.UUIDField,因此同一个调用会引发一个keyrerror,因为request.data结果是一个空dict

我不知道哪里出了问题,因为我的其他用例即使使用UUID作为id也能正常工作

models.py:

class Workspace(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, unique=True)

class Project(models.Model):
    workspace = models.ForeignKey('Workspace',related_name='workspace_projects',on_delete=models.CASCADE,blank=True, null=True)
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, unique=True)

序列化程序.py

class ProjectSerializer(serializers.ModelSerializer):

    def __custom_validator__(self, data):
        method = self.context['request'].method

        if method in ['DELETE']:
            projects_id = [project.id for project in self.instance]
            if data['id'] not in projects_id:
                raise serializers.ValidationError(
                    "Action canceled: Not a Workspace project.")

    def validate(self, data):
        data = super().validate(data)
        self.__custom_validator__(data)
        return data

    class Meta:
        model = Project
        fields = ['id', 'workspace']

views.py

class WorkspaceProjectViewSet(viewsets.ModelViewSet):
    serializer_class = ProjectSerializer

    def destroy(self, request, pk):
        instances = Project.objects.filter(workspace=workspace)
        serializer = self.get_serializer(instances, data=request.data)
        serializer.is_valid(raise_exception=True)

        # Perform deletion.
        project = get_object_or_404(
            Project, pk=serializer.validated_data['id'])
        self.perform_destroy(project)

        return self.__get_response__(workspace)

Tags: pyselfprojectidtruedatamodelsrequest