python - 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()
解决方案
我找到了!我不得不添加save=False
到self.image.save(filename, ContentFile(s))
. 如果您有类似的问题,您可能还想再次保存整个模型(再次调用super(Post, self).save(*args, **kwargs)
)。
推荐阅读
- javafx - 场景生成器未在 Netbeans 中启动,导致路径中出现非英文字母
- http - Lambda 错误:标头“x-request-id”的值“未定义”无效
- perl - 如何使用 Perl 的 WWW::Mechanize “深入”到一个网站
- python - 无法在 Pycharm 中导入 azure.functions
- windows - 是什么阻止 Windows 删除正在使用的文件?
- reactjs - Sass 和 react,使用 @use 将变量导入模块
- mysql - mysql配置文件权限问题
- reactjs - 更新嵌套对象时反应useState延迟
- macos - 如何以编程方式确定哪些进程在 OSX 上积极使用我的网络摄像头?
- windows - 重新安装 pgAdmin 后我会丢失我的数据库吗?