Как загрузить несколько изображений с помощью DJango Rest Framework? - PullRequest
0 голосов
/ 20 октября 2018

Я могу загрузить одно изображение со следующим кодом.Если я выберу несколько изображений, то будет загружено только последнее изображение среди выбранного изображения.

models.py

class Image(models.Model):
property_id = models.ForeignKey(
                'properties.Address',
                null=False,
                default=1,
                on_delete=models.CASCADE
            )
image = models.ImageField(upload_to=directory_path)

serializers.py

class ImageSerializer(serializers.ModelSerializer):
class Meta:
    model = Image
    fields = (
        'property_id',
        'image'
    )

views.py

class ImageView(APIView):
parser_classes = (MultiPartParser, FormParser)

def get(self, request):
    all_images = Image.objects.all()
    serializer = ImageSerializer(all_images, many=True)
    return JsonResponse(serializer.data, safe=False)

def post(self, request, *args, **kwargs):
    file_serializer = ImageSerializer(data=request.data)
    if file_serializer.is_valid():
        file_serializer.save()
        return Response(file_serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)


Я немного новичок в Django.Я хочу перебрать мой массив изображений, который получен в request.data. Может кто-нибудь сказать мне, как это сделать?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Итак, я наконец-то нашел обходной путь, возвращаясь к основам, так как я не нашел способа сделать это с помощью DRF.Я надеюсь, что этот ответ полезен для сообщества Django.Я сохранил мою модель и сериализаторы, изменяя представления, чтобы перебирать каждое изображение и сохранять его с помощью сериализатора.

views.py

class ImageView(APIView):
parser_classes = (MultiPartParser, FormParser)

def get(self, request):
    all_images = Image.objects.all()
    serializer = ImageSerializer(all_images, many=True)
    return JsonResponse(serializer.data, safe=False)

def post(self, request, *args, **kwargs):
    property_id = request.data['property_id']

    # converts querydict to original dict
    images = dict((request.data).lists())['image']
    flag = 1
    arr = []
    for img_name in images:
        modified_data = modify_input_for_multiple_files(property_id,
                                                        img_name)
        file_serializer = ImageSerializer(data=modified_data)
        if file_serializer.is_valid():
            file_serializer.save()
            arr.append(file_serializer.data)
        else:
            flag = 0

    if flag == 1:
        return Response(arr, status=status.HTTP_201_CREATED)
    else:
        return Response(arr, status=status.HTTP_400_BAD_REQUEST)

helpers.py

def modify_input_for_multiple_files(property_id, image):
dict = {}
dict['property_id'] = property_id
dict['image'] = image
return dict

models.py

class Image(models.Model):
property_id = models.ForeignKey(
                'properties.Address',
                null=False,
                default=1,
                on_delete=models.CASCADE
            )
image = models.ImageField(upload_to=directory_path)

serializers.py

class ImageSerializer(serializers.ModelSerializer):
class Meta:
    model = Image
    fields = (
        'property_id',
        'image'
    )

Запрос приходит в форме запроса.Строка images = dict((request.data).lists())['image'] закрывает запрос dict на python dict, а затем перебирает массив под ключом 'image'.

Запрос почтальона выглядит следующим образом :

enter image description here Posts images to the media folder of file system

0 голосов
/ 20 октября 2018

Решение для вас следует использовать ListCreateAPIView.Вам не нужно реализовывать свой собственный вид и обрабатывать все.

class ImageView(generics.ListCreateAPIView):
    parser_classes = (MultiPartParser, FormParser)
    queryset = Image.objects.all()
    serializer_class = ImageSerializer

    def get_serializer(self, *args, **kwargs):
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super(CreateListModelMixin, self).get_serializer(*args, **kwargs)
...