W moim models.py:Django - Wykonywanie zadań przez selera z modelu
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)
W moim 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
Ten wraca następujące:
- Typ wyjątku: ImportError
- Wyjątek Wartość: nie może importować zadania nazw
Błąd znika gdybym wykomentuj from core.models import Image
w tasks.py
jednak to oczywiście spowoduje problem ponieważ Image
ma znaczenia tutaj. Próbowałem zaimportować go wewnątrz create_thumbnail
, ale nadal nie rozpoznaje Image
.
Czytałem gdzieś, że zwykle sam obiekt może zostać przekazany jako argument do zadania i to rozwiąże mój problem. Jednak znajomy powiedział mi kiedyś, że najlepszą praktyką jest wysyłanie możliwie jak najmniejszej ilości danych w wiadomości RabbitMQ, więc w tym celu próbuję jedynie przekazać identyfikator obrazu, a następnie pobrać go ponownie w zadaniu.
1) Czy to, co próbuję zrobić, jest uważane za najlepszą praktykę? Jeśli tak, jak mogę to rozwiązać?
2) Zauważyłem we wszystkich przykładach znalezionych w Internecie, wykonują zadanie z widoku, a nigdy z modelu. Próbuję utworzyć miniaturę za każdym razem, gdy nowy obraz zostanie przesłany, nie chcę wywoływać create_thumbnail w każdej formie/widoku, jaki mam. Masz jakiś pomysł? Czy wykonywanie zadania z modelu nie jest zalecane lub powszechna praktyka?
Naprawdę doceniłem akapit" Aby wyeliminować import okrężny, należy zastanowić się, w jaki sposób powinien nastąpić przywóz ... ". Dziękuję Ci. – pawelmech