【发布时间】:2011-12-27 18:29:01
【问题描述】:
在我的models.py中:
from django.db import models
from core import tasks
class Image(models.Model):
image = models.ImageField(upload_to='images/orig')
thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False)
def save(self, *args, **kwargs):
super(Image, self).save(*args, **kwargs)
tasks.create_thumbnail.delay(self.id)
在我的 tasks.py 中:
from celery.decorators import task
from core.models import Image
@task()
def create_thumbnail(image_id):
ImageObj = Image.objects.get(id=image_id)
# other stuff here
这将返回以下内容:
- 异常类型: ImportError
- 异常值:无法导入名称任务
如果我在tasks.py 中注释掉from core.models import Image,错误就会消失,但这显然会导致问题,因为Image 在这里没有任何意义。我尝试将它导入到 create_thumbnail 中,但它仍然无法识别 Image。
我在某处读到,通常对象本身可以作为参数传递给任务,这样可以解决我的问题。但是,一位朋友曾经告诉我,在 RabbitMQ 消息中发送尽可能少的数据被认为是最佳实践,因此我试图仅传递图像 ID,然后在任务中再次检索它。
1) 我正在尝试做的事情是否被视为最佳做法?如果是,我该如何解决?
2) 我注意到在网上找到的所有示例中,它们从视图执行任务,而不是从模型执行。每当上传新图像时,我都会尝试创建缩略图,我不想在我拥有的每个表单/视图中调用 create_thumbnail。有什么想法吗?从模型中执行任务是不推荐的还是常见的做法?
【问题讨论】: