【发布时间】:2022-01-22 17:52:48
【问题描述】:
我想在 django 中创建一个包含多个图像的发布请求。
我尝试为图像创建不同的模型并使用 OnetoOneField 将其连接到我的“车辆”模型,但它一次只允许发布 1 个图像。(此方法如下所示)
我还尝试将多个图像作为逗号分隔的字符串获取,但是当我将图像作为二进制图像列表发布时,它显示“无效类型”错误。
我只需要创建一个 API 来一次性发布多张图片。
这是我的 model.py 文件 -
class VehicleImage(models.Model):
image_id = models.AutoField(primary_key=True)
image = models.ImageField(upload_to="media")
def __str__(self):
return self.vehicle.auction_title
class Vehicle(models.Model):
auction_title = models.TextField()
vehicle_images = models.ManyToManyField(VehicleImage, blank=True)
vehicle_images_list = models.TextField()
def __str__(self):
return self.auction_title
Serializer.py 文件 -
class VehicleImageSerializer(serializers.ModelSerializer):
class Meta:
model = VehicleImage
fields = "__all__"
class VehicleSerializer(serializers.ModelSerializer):
vehicle_images = VehicleImageSerializer(many=True, read_only=True)
class Meta:
model = Vehicle
fields = "__all__"
def create(self, validated_data):
images_data = validated_data['vehicle_images_list']
vehicle = Vehicle.objects.create(**validated_data)
if images_data!="":
for data in images_data.split(','):
image = VehicleImage.objects.get(image_id=data)
vehicle.vehicle_images.add(image)
return vehicle
Views.py 文件
class add_vehicle(ListCreateAPIView):
queryset = Vehicle.objects.all().order_by('-vehicle_id')
serializer_class = VehicleSerializer
pagination_class = CustomPagination
def post(self, request, format=None):
# creating the Vehicle
vehicle_serializer = VehicleSerializer(data=request.data)
if vehicle_serializer.is_valid():
vehicle_serializer.save()
return Response({
"response":{"vehicle_id":vehicle_serializer.data['vehicle_id']},
"status_code":200}, status = status.HTTP_200_OK)
return Response({
"response":vehicle_serializer.errors,
"status_code":400}, status = status.HTTP_400_BAD_REQUEST)
class add_images(ListCreateAPIView):
queryset = VehicleImage.objects.all()
serializer_class = VehicleImageSerializer
pagination_class = CustomPagination
def post(self, request, format=None):
image_serializer = VehicleImageSerializer(data=request.data)
if image_serializer.is_valid():
image_serializer.save()
return Response({
"response":image_serializer.data,
"status_code":200}, status = status.HTTP_200_OK)
return Response({
"response":image_serializer.errors,
"status_code":400}, status = status.HTTP_400_BAD_REQUEST)
使用此方法,我首先使用“add_images”类逐个添加图像,然后在创建车辆时提供图像 ID 列表。有没有办法一次性添加所有图片?
【问题讨论】:
-
我认为没有办法直接使用DRF上传多张图片。您可能需要在
view.py中迭代图像,更多详细信息请访问stackoverflow.com/a/53035559/16785359 -
我尝试了类似的方法,如此链接所示。它适用于邮递员,但是当我将它与 angular 一起使用时它不起作用,因为我无法获得二进制图像数据列表。它只显示一个列表 - [
-
我敢肯定,它有角度问题,而不是后端问题。您应该在前端修复表单或 API。
标签: python django django-models django-rest-framework django-views