Теперь я создаю веб-приложение, которое позволяет пользователю загружать изображения с помощью Django Rest Framework. Я хочу повернуть эти изображения в соответствии с тегом EXIF и сохранить.
Сначала я нашел Сюда, и он работает в локальной среде. Но теперь я использую Amazon S3 для развертывания, тогда этот способ не работает.
Итак, я пытаюсь повернуть изображение перед сохранением и борюсь ... Ниже приведен недавний код, поднимающий TypeError at /api/work/ 'str' object is not callable, когда я публикую новый объект Work.
Как это исправить? Или есть другой хороший способ?
[models.py]
from django.db import models
from django.conf import settings
from PIL import Image as Img
from PIL import ExifTags
from io import BytesIO
from django.core.files import File
import datetime
class Work(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)
title = models.CharField(max_length=120)
made_date = models.DateField(default=datetime.date.today, null=True, blank=True)
note = models.TextField(max_length=2000, null=True, blank=True)
image = models.ImageField(upload_to='work_pic', default='default_image.png')
def __str__(self):
return self.title
def save(self, *args, **kwargs):
if self.image:
pilImage = Img.open(BytesIO(self.image.read()))
for orientation in ExifTags.TAGS.keys():
if ExifTags.TAGS[orientation] == 'Orientation':
break
exif = dict(pilImage._getexif ().items())
if exif[orientation] == 3:
pilImage = pilImage.rotate(180, expand=True)
elif exif[orientation] == 6:
pilImage = pilImage.rotate(270, expand=True)
elif exif[orientation] == 8:
pilImage = pilImage.rotate(90, expand=True)
output = BytesIO()
pilImage.save(output, format='JPEG', quality=75)
output.seek(0)
self.image = File(output, self.image.name())
return super(Work, self).save(*args, **kwargs)
[serializers.py]
from rest_framework import serializers
from .models import Work
class WorkSerializer(serializers.ModelSerializer):
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
class Meta:
model = Work
fields = '__all__'
def create(self, validated_data):
return Work.objects.create(**validated_data)






В вашем методе save() вы вызываете атрибут self.image.name как функцию. Image.name является атрибутом string, поэтому вам не нужно вызывать его как функцию.
Так что измените строку
self.image = File(output, self.image.name()) - self.image = File(output, self.image.name)
устранит ошибку
Полное определение модели
class Work(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)
title = models.CharField(max_length=120)
made_date = models.DateField(default=datetime.date.today, null=True, blank=True)
note = models.TextField(max_length=2000, null=True, blank=True)
image = models.ImageField(upload_to='work_pic', default='default_image.png')
def __str__(self):
return self.title
def save(self, *args, **kwargs):
if self.image:
pilImage = Img.open(BytesIO(self.image.read()))
for orientation in ExifTags.TAGS.keys():
if ExifTags.TAGS[orientation] == 'Orientation':
break
exif = dict(pilImage._getexif ().items())
if exif[orientation] == 3:
pilImage = pilImage.rotate(180, expand=True)
elif exif[orientation] == 6:
pilImage = pilImage.rotate(270, expand=True)
elif exif[orientation] == 8:
pilImage = pilImage.rotate(90, expand=True)
output = BytesIO()
pilImage.save(output, format='JPEG', quality=75)
output.seek(0)
self.image = File(output, self.image.name)
return super(Work, self).save(*args, **kwargs)Большое спасибо! Эта проблема была полностью решена !!
Могу ли вы добавить полную трассировку вашей ошибки?