В моих моделях.
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)
В моих задачах.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
- Значение исключения: не может импортировать задачи имен
Ошибка исчезнет, если я закомментирую from core.models import Image
в tasks.py
, однако это, очевидно, вызовет проблему, поскольку Image
не имеет здесь никакого значения. Я попытался импортировать его в create_thumbnail
, но он все равно не распознает Image
.
Я где-то читал, что обычно сам объект может быть передан в качестве аргумента для задачи, и это решило бы мою проблему. Однако один мой друг однажды сказал мне, что рекомендуется отправлять как можно меньше данных в сообщении RabbitMQ, поэтому для этого я пытаюсь только передать идентификатор изображения, а затем снова получить его в задаче. *
1) То, что я пытаюсь сделать, считается лучшей практикой? Если да, то как мне это решить?
2) Я заметил, что во всех примерах, найденных в Интернете, они выполняют задачу из представления, а не из модели. Я пытаюсь создать миниатюру всякий раз, когда загружается новое изображение, я не хочу вызывать create_thumbnail в каждой форме / представлении, которое у меня есть. Есть идеи по этому поводу? Выполнение задачи из модели не рекомендуется или является обычной практикой?