Поля Django не сохраняются
Я хочу получить файл от клиента и выполнить некоторую обработку изображения в соответствующем классе модели перед его сохранением в базе данных. Однако, поскольку файл не сохраняется до конца метода save(), каталог, в котором хранится файл, не создается, и я получаю ошибку FileNotFoundError: [Errno 2] No such file or directory: 'media/upload/vertical_image.jpg'.
.
На самом деле я ищу способ выполнить всю обработку в методе save
Это моя модель медиа:
class Media(models.Model):
title = models.CharField(max_length=255, null=True, blank=True)
file = models.FileField(upload_to="upload/")
filename = models.CharField(max_length=255, null=True, blank=True)
mime_type = models.CharField(max_length=255, null=True, blank=True)
thumbnail = models.JSONField(null=True, blank=True)
size = models.FloatField(null=True, blank=True)
url = models.CharField(max_length=300, null=True, blank=True)
thumbhash = models.CharField(max_length=255, blank=True, null=True)
is_public = models.BooleanField(blank=True, null=True)
def save(self, *args, **kwargs):
sizes = [(150, 150), (256, 256)]
media_path = f"media/upload/{self.filename}"
image = Image.open(media_path)
mime_type = image.get_format_mimetype()
format = mime_type.split("/")[1]
if not os.path.exists("media/cache"):
os.makedirs("media/cache")
thumbnail = {}
for i, size in enumerate(sizes):
resized_image = image.resize(size)
index = "small" if i == 0 else "medium"
file_path = os.path.join(
"media",
"cache",
f"{self.id}-resized-{self.filename}-{index}.{format}",
)
resized_image.save(file_path, format=format)
thumbnail["*".join(str(i) for i in size)] = file_path
self.mime_type = mime_type
self.size = os.path.getsize(media_path)
self.thumbnail = thumbnail
self.url = f"http://127.0.0.1:8000/media/upload/{self.filename}"
self.thumbhash = image_to_thumbhash(image)
super().save(*args, **kwargs)
а это мой медиасериализатор:
class MediaSerializer(serializers.ModelSerializer):
class Meta:
model = Media
fields = [
"id",
"title",
"file",
"filename",
]
def create(self, validated_data):
return Media(**validated_data)```
Сначала получаем байты изображения, выполняем обработку байтов и записываем байты в файл.
class Media(models.Model):
file = models.FileField(upload_to="upload/")
def save(self, *args, **kwargs):
file_byte = self.file.read()
file_byte_processed = your_process(file_byte)
self.file.write(file_byte_processed)
return super().save(*args, **kwargs)