更新:
在对已接受的答案做了一些小的修改后,我能够解决它:
class GalleryView(APIView):
parser_class = (FileUploadParser,)
def post(self, request):
# Extract the facility ID and list of pictures from the request
print('post method called')
facility_id = request.data.get('facility')
pictures = request.data.getlist('pictures')
print(facility_id, pictures)
facility = get_object_or_404(Facility, id=facility_id)
try:
gallery = Gallery.objects.get(facility=facility)
except Gallery.DoesNotExist:
gallery = Gallery.objects.create(facility=facility)
with transaction.atomic():
for picture in pictures:
print('for loop executing')
try:
webp_image = BytesIO()
image = Image.open(picture)
image.save(webp_image, format='webp', quality=5)
print(webp_image)
file_name = picture.name
if picture.name.lower().endswith(('.jpg', '.jpeg', '.png')):
file_name = f"{os.path.splitext(picture.name)[0]}.webp"
else:
file_name = picture.name
file_object = ContentFile(webp_image.getvalue(), name=file_name)
print(file_object)
picture_obj = Picture.objects.create(picture=file_object)
print(picture_obj)
gallery.pictures.add(picture_obj)
print(gallery)
except Exception as e:
print(type(e))
continue
serializer = GallerySerializer(gallery)
return Response(serializer.data, status=201)
我试着创建一个上传表单来上传多张需要转换成webp的图片。在我添加webp转换位之前,一切都很好。我试着添加异常和print语句来跟踪这个问题,但是没有出现异常。相反,它显示了所有成功的迹象,并在数据库中创建了一个空的"picture"元素。我正在使用django cookiectter项目。有人知道是什么引起的吗?
models.py
def upload_gallery_image(instance, filename):
# Print a message to indicate that the function was called
print(instance, filename)
return f'galleries/{instance.facility.id}/{filename}'
class Picture(models.Model):
picture = models.ImageField(upload_to=upload_gallery_image)
class Gallery(models.Model):
facility = models.ForeignKey(Facility, on_delete=models.CASCADE, related_name='tourphotos')
pictures = models.ManyToManyField(Picture, related_name='galleries')
views.py
class GalleryView(APIView):
parser_class = (FileUploadParser,)
def post(self, request):
# Extract the facility ID and list of pictures from the request
print('post method called')
facility_id = request.data.get('facility')
pictures = request.data.getlist('pictures')
print(facility_id, pictures)
facility = get_object_or_404(Facility, id=facility_id)
try:
gallery = Gallery.objects.get(facility=facility)
except Gallery.DoesNotExist:
gallery = Gallery.objects.create(facility=facility)
for picture in pictures:
print('for loop executing')
try:
webp_image = BytesIO()
image = Image.open(picture)
image.save(webp_image, format='webp', quality=75)
print(webp_image)
file_object = ContentFile(webp_image.getvalue())
print(file_object)
picture_obj = Picture.objects.create(picture=file_object)
print(picture_obj)
gallery.pictures.add(picture_obj)
print(gallery)
except Exception as e:
print(type(e))
continue
webp_image.close()
serializer = GallerySerializer(gallery)
return Response(serializer.data, status=201)
serializers.py
class PictureSerializer(serializers.ModelSerializer):
class Meta:
model = Picture
fields = ('id', 'picture')
class GallerySerializer(serializers.ModelSerializer):
pictures = PictureSerializer(many=True)
class Meta:
model = Gallery
fields = ('id', 'pictures')
服务器响应:
django | post method called
django | 24 [<InMemoryUploadedFile: 156f9f885e468c60dd7d6d539f2ee1bb.webp (image/webp)>]
django | for loop executing
django | <_io.BytesIO object at 0x7fbfdb14eef0>
django | Raw content
django | Picture object (304)
django | Gallery object (59)
django | 172.21.0.1 - - [02/Jan/2023 11:09:44] "POST /api/multipleupload/ HTTP/1.1" 201 -
1条答案
按热度按时间2guxujil1#
尝试将名称添加到ContentFile,在您的情况下更改为:
ContentFile不会创建没有文件名的文件。