Джанго обновление ViewSet

В настоящее время я занимаюсь разработкой проекта галереи изображений django. Пользователь может загружать изображения, а затем загружать "результат" для каждого из изображений. Я знаю, что мне нужно переопределить функцию update (...), но я думаю, что мне нужна помощь с Base64ImageFiled.

Шаг за шагом:

  1. Пользователь загружает изображение (результат = ноль)
  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'])
    ???

1 ответ

Соглашение Django Rest Framework состоит в том, чтобы использовать частичное_дупление вместо обновления (метод запроса 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)
Другие вопросы по тегам