如何使用 DJango Rest Framework 上传多个图像?
How to upload multiple Images using DJango Rest Framework?
我可以使用以下代码上传单张图片。如果我 select 多张图片,那么只有 selected 图片中的最后一张图片被上传。
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 中接收到的图像数组 谁能告诉我该怎么做?
您的解决方案应该使用 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)
所以我终于以自己的方式找到了一个变通方法,回到了基础,因为我没有找到任何以 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']
行将查询字典转换为 python 字典,然后在 'image'
键下遍历数组。
邮递员请求如下所示:
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 ImageAPIView(ListCreateAPIView):
queryset = Image.objects.all()
serializer_class = ImageSerializer
def post(self, request, *args, **kwargs):
property_id = request.data['property']
form_data = {}
form_data['property']= property_id
success = True
response = []
for images in request.FILES.getlist('images'):
form_data['images']=images
print(form_data)
serializer = PropertyImageSerializers(data=form_data)
if serializer.is_valid():
serializer.save()
response.append(serializer.data)
else:
success = False
if success:
#return Response(response, status=status.HTTP_201_CREATED)
return Response({
'status' : 1,
'message' : 'Success',
'Data' : response,
})
#returnResponse(response,status=status.HTTP_400_BAD_REQUEST)
return Response({
'status' : 0,
'message' : 'Error!',
})
我可以使用以下代码上传单张图片。如果我 select 多张图片,那么只有 selected 图片中的最后一张图片被上传。
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 中接收到的图像数组 谁能告诉我该怎么做?
您的解决方案应该使用 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)
所以我终于以自己的方式找到了一个变通方法,回到了基础,因为我没有找到任何以 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']
行将查询字典转换为 python 字典,然后在 'image'
键下遍历数组。
邮递员请求如下所示:
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 ImageAPIView(ListCreateAPIView):
queryset = Image.objects.all()
serializer_class = ImageSerializer
def post(self, request, *args, **kwargs):
property_id = request.data['property']
form_data = {}
form_data['property']= property_id
success = True
response = []
for images in request.FILES.getlist('images'):
form_data['images']=images
print(form_data)
serializer = PropertyImageSerializers(data=form_data)
if serializer.is_valid():
serializer.save()
response.append(serializer.data)
else:
success = False
if success:
#return Response(response, status=status.HTTP_201_CREATED)
return Response({
'status' : 1,
'message' : 'Success',
'Data' : response,
})
#returnResponse(response,status=status.HTTP_400_BAD_REQUEST)
return Response({
'status' : 0,
'message' : 'Error!',
})