Поля 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)
Вернуться на верх