我正在开发一个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)
目前没有回答
相关问题 更多 >
编程相关推荐