【问题标题】:Django update ViewSetDjango 更新视图集
【发布时间】:2016-08-29 13:12:53
【问题描述】:

目前我正在开发一个图片库 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】:

    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)
    

    编辑: 尝试这些更改:

    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)
    

    【讨论】:

    • 感谢您的回答。现在我收到以下错误:AttributeError: type object 'ImageSerializer' has no attribute 'serialize'
    • 您使用的是哪个版本的 DRF?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多