Django 更新视图集

dja*_*lar 5 django django-models imagefield django-rest-framework

目前我正在开发一个图片库 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'])
    ???
Run Code Online (Sandbox Code Playgroud)

mda*_*acz 10

Django Rest Framework 约定是使用 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)
Run Code Online (Sandbox Code Playgroud)

编辑: 尝试这些更改:

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)
Run Code Online (Sandbox Code Playgroud)