Django 更新 ViewSet

问题描述 投票:0回答:1

目前我正在开发一个图片库 django 项目。用户可以上传图像,然后将“结果”上传到每个图像。 我知道我必须重写 update(...) 函数,但我认为我需要 Base64ImageFiled 的帮助。

一步一步:

  1. 用户上传图片(结果 = null)
  2. 图像存储在云端
  3. 用户将结果上传到指定图像(此处需要帮助)

这是我当前的结构:

class Image(models.Model):
  project = models.ForeignKey(Project)
  image = models.ImageField(upload_to='images')
  result = models.ImageField(upload_to='results')

class ImageSerializer(serializers.ModelSerializer):
  project = ProjectSerializer(read_only=True, required=False)
  image = Base64ImageField(max_length=None, use_url=False)
  result = Base64ImageField(max_length=None, use_url=False, required=False)

class ProjectImagesViewSet(viewsets.ViewSet):
  queryset = Image.objects.select_related('project').all()
  serializer_class = ImageSerializer

  def list(self, request, project_pk=None):
    queryset = self.queryset.filter( project__name = project_pk)
    serializer = self.serializer_class(queryset, many=True)
    return Response(serializer.data)

  def update(self, request, pk=None, project_pk=None):
    print(request.data['result'])
    ???
django django-models django-rest-framework imagefield
1个回答
12
投票

Django Rest框架约定是使用partial_update而不是update(PATCH请求方法)。如果您将带有图像的 PATCH 请求发送到与检索 url 相同的 url,它应该会更新。如果您需要更新附加功能,那么您可以定义:

class ProjectImagesViewSet(viewsets.ViewSet):
    #.....
    def partial_update(self, request, *args, **kwargs):
            instance = self.get_object()
            serializer = self.serialize(instance, data=request.data, partial=True)
            serializer.is_valid(raise_exception=True)
            #.... Your code ....
            serializer.save()
            return Response(serializer.data)

编辑: 尝试这些改变:

class ImageSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True, required=False)
    image = Base64ImageField(max_length=None, use_url=False)
    result = Base64ImageField(max_length=None, use_url=False, required=False)

    class Meta:
        model = Image


class ProjectImagesViewSet(viewsets.ViewSet):
    queryset = Image.objects.select_related('project').all()
    serializer_class = ImageSerializer

    def list(self, request, project_pk=None):
        queryset = self.queryset.filter(project__name=project_pk)
        serializer = self.serializer_class(queryset, many=True)
        return Response(serializer.data)

    def update(self, request, pk=None, project_pk=None):
        print(request.data['result'])

    def partial_update(self, request, *args, **kwargs):
        instance = self.queryset.get(pk=kwargs.get('pk'))
        serializer = self.serializer_class(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)
© www.soinside.com 2019 - 2024. All rights reserved.