Я хочу, чтобы моя модель звонила save_image()
каждый раз, когда пользователь создает новую модель Post. Я попытался переопределить метод save (), но он вызывает бесконечное l oop (потому что save_image()
вызывает self.image.save()
.). Я пытался отключить сигналы, но они ничего не сделали. Я хотел добавить что-то вроде @receiver(post_save, sender=Post)
для save_image и удалить переопределение save () (я даже не знаю, решит ли это проблему с бесконечным l oop). Основная проблема здесь в том, что save_post () ДОЛЖЕН вызываться после стандартного сохранения (потому что для этого нужны Post.pk, Post.video). Если у вас есть идеи, пожалуйста, помогите мне.
Вот мой код:
class Post(BaseModel):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
# Other fields
video = models.FileField(upload_to='post_videos/', default='defaults/video.mp4')
image = models.ImageField(upload_to='post_images', default='defaults/post_image.png')
def save(self, *args, **kwargs):
super(Post, self).save(*args, **kwargs)
self.save_image()
@receiver(post_save, sender=Post)
def save_image(self):
# Setting self.image to some frame of Video
cap = cv2.VideoCapture(self.video.path)
video_length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - 1
if cap.isOpened() and video_length > 0:
success, image = cap.read()
if success:
rescaled = (255.0 / image.max() * (image - image.min())).astype(np.uint8)
PILimg = Image.fromarray(rescaled)
filename = "postimage"+str(self.pk)+".png"
f = BytesIO()
try:
PILimg.save(f, format='png')
s = f.getvalue()
self.image.save(filename, ContentFile(s))
finally:
f.close()