我正在尝试编写一个接收视频文件的小应用程序,并在上传后将它们转换为统一格式(因此添加到数据库中)。我已经在网上搜索了最佳解决方案,并决定使用Django的信号 芹菜。但是现在我正试图创建一个概念验证,看看它是否有效。
我正在尝试执行一个 video_repalce()
上传新视频后的方法(因此,新数据已添加到数据库中)。但是信号不能正常工作,或者我不明白整个系统是如何工作的。
我在用着 Django 1.2.3 具有预定义的信号 django.db.models.signals.post_init
, 哪一个 应该 在模型实例化后调用 (因此,在数据库中添加了一个新行)。
from django.core.files.base import File
from django.db.models.signals import post_init
import os
import os.path
import subprocess
class Project(models.Model):
video = models.FileField(upload_to="projects/videos")
def replace_video(self):
"""Replace original video with an updated one."""
# Video conversion process code goes here,
# resulting in a new external video file.
self.video.delete() # Delete the original video.
self.video.save("newfile.webm", File(open("path/to/newfile.webm") ,"wb"))) # Save the new video instead.
self.save() # Commit everything to database.
os.remove("path/to/newfile.webm") # Remove original video copy after it was commited (copied) into the DB.
# ...
# ...
def handle_new_project(sender, **kwargs):
"""Handels some additional tasks for a new added project. i.e. convert video to uniform format."""
project = kwargs['instance']
project.replace_video()
# Call 'Project.replace_video()' every time a new project is added.
post_init.connect(handle_new_project, sender=Project, dispatch_uid="new_project_added")
但是,调用post_init 不仅 在创建新模型实例时,还要...:
- 在模型甚至实例化之前。我的意思是,当我第一次执行服务器时调用它,当数据库中甚至没有一行数据时(因此,不应该实例化Model对象)。实例的
self.pk
是None
! - 什么时候
save()
- 一个模型。我点击时也会执行上面的代码self.save()
。
实际上,它根据文档不起作用。
我究竟做错了什么?请记住,这是一个概念验证。我打算将代码移动到 芹菜 在我看到它正在工作之后但是,如果信号不正常, 芹菜 无济于事 - 每当我发出信号时,信号总会被重复几次 save()
或更新视频。
你觉得我不应该打电话吗? save()
在 - 的里面 replace_video()
方法?那我应该在哪里打电话呢?我应该选择哪个信号? post_save
不是一个好选择,因为无论什么时候我都会打电话 save()
。