Django Сигналы - Как сохранить экземпляр - PullRequest
0 голосов
/ 26 марта 2020

Я использую Django Rest Framework для загрузки видео. Теперь я хотел добавить миниатюры к моим видео файлам. Всякий раз, когда объект Video сохраняется, я хотел создать миниатюру и установить ее поле thumbnail.

Моя модель видео выглядит следующим образом:

class Video(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    text = models.CharField(max_length=100, blank=True)
    video = models.FileField(upload_to='Videos/',blank=True)
    thumbnail = models.ImageField(upload_to = 'Images/', blank = True)

Мой обработчик сигналов выглядит следующим образом:

from moviepy.video.io.VideoFileClip import VideoFileClip
from posts.models import Video
from django.db.models.signals import post_save
from django.dispatch import receiver
from settingsFolderOfProject.settings import MEDIA_ROOT
import os

# when save() of Video is done, create_thumbnail_from_video() is called
@receiver(post_save, sender=Video)
def create_thumbnail_from_video(sender, instance, created, **kwargs):
    if created:
        # create the clip using moviepy's VideoFileClip class
        clip = VideoFileClip(os.path.join(MEDIA_ROOT, instance.video.name))
        # create the frame at 1st second and set it to instance's thumbnail field
        instance.thumbnail = clip.save_frame(os.path.join(MEDIA_ROOT, 'Images/thumbnail.jpg'),t='00:00:01') 
        # save the instance 
        instance.save()       # <--- I think this op does not work properly

Что я должен изменить? Файл миниатюр создается в папке, как и ожидалось, но Django не устанавливает поле thumbnail моего экземпляра модели Video. Поле thumbnail созданного экземпляра Video по-прежнему имеет значение null.

1 Ответ

2 голосов
/ 26 марта 2020

clip.save_frame () ничего не возвращает. Вместо этого выполните

path = os.path.join(MEDIA_ROOT, 'Images/thumbnail.jpg')
clip.save_frame(path,t='00:00:01') 
instance.thumbnail = path
instance.save()

Примечание: еще не тестировали. Прокомментируйте, если проблема все еще сохраняется. Thnx ...

...