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