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

2024-09-26 18:06:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在pythondjango中,我有一个包含FileField成员的模型。此成员存储视频文件。在

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

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

我怎么能做到呢?我调查过Django的客户经理,但我不认为这就是我要找的。在

谢谢。:)


Tags: 对象django实例模型数据库标准视频过程
3条回答

您可以重写save()或使用signals。在

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

实际上我也在做同样的事情。由于以下几个原因,您不希望在收到相同请求时处理该视频文件:

1)你会把用户挂在一个没有响应的页面上很长一段时间,可能会让他们超时并怀疑它是否有效。 2) 如果他们去看看它是否上传-它还没有完成并保存在数据库(不一致),他们会认为它是坏的。在

您希望最初将记录和文件保存在服务器上。标记为需要处理。然后启动一个芹菜任务来完成这项工作,并在完成后更新该标志。实际上,我正在为一个我现在正在做的项目和zencoder做同样的事情。它工作得很好。在

芹菜:http://pypi.python.org/pypi/django-celery 贫民区(当地人):http://pypi.python.org/pypi/ghettoq

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

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

为了把事情安排好:

信号.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派生的类。在

{a3}的另一种设置方式。在

请注意,由于您在这里考虑视频编码,您可能不想在这些方法中实际重新编码视频,否则您的请求将永远无法完成。更好的方法是检查编码,并让模型有一个status字段来表示webM或{}。然后把你的编码任务转移到别处,在视频完成之前不要显示它(Videos.objects.filter(format='webm')。在

相关问题 更多 >

    热门问题