Django:如何在将Model对象添加到DB之前对其进行操作?

时间:2011-01-14 13:52:31

标签: python django

在Python-Django中,我有一个带有FileField成员的Model。该会员存储视频文件。

我想“干扰”Django的标准“添加模型行/对象/实例”程序,并在实际提交或将其添加到之前操纵我正在添加的每个视频数据库中。

操作是将视频转换为特定的统一格式。因此,所有添加的视频最终将以相同的格式存储( WebM )。

我该怎么做?我查看了Django的自定义管理器,但我认为这不是我想要的。

感谢。 :)

4 个答案:

答案 0 :(得分:5)

您可以覆盖save()或使用signals

但是,转换视频需要花费大量时间。在您的Web请求中同步执行此操作可能不是一个好主意。常见的方法是将工作卸载到任务队列。请查看Celery

答案 1 :(得分:3)

或者您可以使用django signals在项目即将或已经保存到数据库时触发事件。

具体来说,您使用Signal.connect()方法连接要启动的信号处理程序,例如pre_savepost_savepre_deletepost_delete等。

为了进行设置:

<强> signals.py

from django.db.models.signals import *

def entry_action_post_save(sender, instance, **kwargs):
    # what do we want to do here?
    pass

post_save.connect    (entry_action_post_save,        sender=Entry)

对我而言,Entrymodels.Model派生类。

此博客还介绍了使用dispatcher in models.py进行设置的另一种方式。

请注意,由于您在此处考虑视频编码,因此您可能不希望在这些方法中对视频进行实际重新编码,否则您的请求将需要永久完成。更好的方法是检查编码,并使模型具有statuswebM的{​​{1}}字段。然后将编码任务传递到其他地方,并且在完成之前不要显示视频(notwebm)。

答案 2 :(得分:3)

我实际上是在做同样的事情。您不希望在出现的同一请求中处理视频文件,原因如下:

1)您将用户长时间挂在非响应式页面上,可能会将其计时并想知道它是否有效。 2)如果他们去看看它是否已上传 - 它仍未完成并保存在数据库中(不一致),他们会认为它已被破坏。

您希望最初将记录和文件保存在服务器上。将其标记为需要处理的工作。并启动芹菜任务,该任务将完成该工作并在完成时更新该标志。对于我正在进行的项目,我实际上正在使用zencoder做同样的事情。它运作得非常好。

芹菜:http://pypi.python.org/pypi/django-celery Ghettoq(当地):http://pypi.python.org/pypi/ghettoq

答案 3 :(得分:2)

您可以覆盖模型上的save()方法。请参阅the documentation