首页 > 解决方案 > Django 避免无限 save() 循环,使用自定义模型方法保存 ImageField

问题描述

save_image()每次用户创建新的 Post 模型时,我都想调用我的模型。我试图覆盖 save() 方法,但它会导致无限循环(因为save_image()调用self.image.save(). )。我尝试禁用信号,但它们什么也没做。我想@receiver(post_save, sender=Post)为 save_image 添加类似的内容,并删除 save() 的覆盖(我什至不知道它是否会解决无限循环的问题)。这里的主要问题是,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()

标签: pythondjangodatabase

解决方案


我找到了!我不得不添加save=Falseself.image.save(filename, ContentFile(s)). 如果您有类似的问题,您可能还想再次保存整个模型(再次调用super(Post, self).save(*args, **kwargs))。


推荐阅读