Django - Выполнение задачи через сельдерей из модели

В моем 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)

In my 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
  • Значение исключения: не удается импортировать задачи имени

Ошибка исчезает, если я закомментирую из core.models import Image в tasks.py , однако это, очевидно, вызовет проблему, поскольку Изображение здесь не имеет значения. Я попытался импортировать его в create_thumbnail , но он все равно не распознает Изображение .

Я где-то читал, что обычно сам объект может быть передан в качестве аргумента задаче, и это решит мою проблему. Однако мой друг однажды сказал мне, что лучше всего отправлять как можно меньше da ta в сообщении RabbitMQ, поэтому для этого я пытаюсь передать только идентификатор изображения, а затем снова получить его в задаче.

1) Считается ли то, что я пытаюсь делать, наилучшей практикой? Если да, то как мне это решить?

2) Я заметил, что во всех примерах, которые я нашел в Интернете, они выполняют задачу из представления, а не из модели. Я пытаюсь создать миниатюру всякий раз, когда загружается новое изображение, я не хочу вызывать create_thumbnail в каждой форме / представлении, которое у меня есть.Есть идеи по этому поводу? Выполнение задачи из модели не рекомендуется или является обычной практикой?

9
задан Aziz Alfoudari 12 November 2011 в 20:57
поделиться