Ory*_*and 11 python django signals
我正在尝试编写一个接收视频文件的小应用程序,并在上传后将它们转换为统一格式(因此添加到数据库中).我已经在网上搜索了最佳解决方案,并决定在Celery中使用Django的信号.但是现在我正试图创建一个概念验证,看看它是否有效.
我正在尝试video_repalce()在上传新视频后执行方法(因此,新数据已添加到数据库中).但是信号不能正常工作,或者我不明白整个系统是如何工作的.
我正在使用带有预定义信号的Django 1.2.3django.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")
Run Code Online (Sandbox Code Playgroud)
但是,不仅在创建新模型实例时调用post_init ,而且还调用...:
self.pk是None!save()一个模特.我点击时也会执行上面的代码self.save().实际上,它根据文档不起作用.
我究竟做错了什么?请记住,这是一个概念验证.我打算在看到它正常工作后将代码移到Celery.但是,如果信号无法正常工作,Celery将无法提供帮助 - 每当我save()或更新视频时,信号将始终重发几次.
你认为我不应该save()在replace_video()方法内部打电话吗?那我应该在哪里打电话呢?我应该选择哪个信号?post_save不是一个好的选择,因为无论什么时候我都会打电话save().
Dan*_*man 14
您似乎对实例化对象的含义有点混淆.它与数据库没有任何关系.这会实例化一个模型对象而不将其保存到数据库中,在这种情况下,它的pk将为None:
MyObject(field1='foo', field2='bar')
Run Code Online (Sandbox Code Playgroud)
并且这(间接地)通过从数据库中获取对象来实例化它:
MyObject.objects.get(field1='baz')
Run Code Online (Sandbox Code Playgroud)
该post_init信号将在这两种情况下被发送,即使他们都不具有任何与保存到数据库中.
如果您希望在保存时发生某些事情,请覆盖save方法本身,或使用pre_save或post_save信号.您可以通过验证对象是否pk为None 来检查该对象之前是否已保存.
| 归档时间: |
|
| 查看次数: |
5227 次 |
| 最近记录: |