Джанго обновление ViewSet
В настоящее время я занимаюсь разработкой проекта галереи изображений django. Пользователь может загружать изображения, а затем загружать "результат" для каждого из изображений. Я знаю, что мне нужно переопределить функцию update (...), но я думаю, что мне нужна помощь с Base64ImageFiled.
Шаг за шагом:
- Пользователь загружает изображение (результат = ноль)
- Изображение хранится в облаке
- Пользователь загружает результат в указанное изображение (нужна помощь здесь)
Вот моя текущая структура:
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)