2016-05-04 3 views
0

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

Шаг за шагом:

  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']) 
    ??? 

ответ

0

Соглашение Django Rest Framework заключается в использовании partial_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) 

EDIT: Попробуйте эти изменения:

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) 
+0

Спасибо за ответ. Теперь я получаю следующую ошибку: AttributeError: type object 'ImageSerializer' не имеет атрибута 'serialize' – djangoangular

+0

, какую версию DRF вы используете? – mdargacz