Dans mon models.py:Django - L'exécution d'une tâche par le céleri d'un modèle
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)
Dans mon 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
Ce retourne les éléments suivants:
- Type d'exception: ImportError
- Exception Valeur: ne peut pas importer des tâches nom
L'erreur disparaît si je commente sur from core.models import Image
dans tasks.py
, mais cela va évidemment causer un problème puisque Image
n'a pas de sens ici. J'ai essayé d'importer à l'intérieur create_thumbnail
mais il ne reconnaîtra toujours pas Image
.
J'ai lu quelque part qu'habituellement l'objet lui-même peut être passé comme argument à une tâche et cela résoudrait mon problème. Cependant, un ami m'a dit une fois qu'il est considéré comme la meilleure pratique d'envoyer le moins de données possible dans un message RabbitMQ, afin d'obtenir que j'essaie de ne transmettre que l'ID de l'image et ensuite le récupérer dans la tâche.
1) Est-ce que ce que j'essaie de faire est considéré comme une bonne pratique? Si oui, comment puis-je le résoudre?
2) J'ai remarqué dans tous les exemples que j'ai trouvés sur le web qu'ils exécutent la tâche depuis une vue et jamais depuis un modèle. J'essaie de créer une vignette chaque fois qu'une nouvelle image est téléchargée, je ne veux pas appeler create_thumbnail dans toutes les formes/vues que j'ai. Une idée à ce sujet? Est-ce que l'exécution d'une tâche à partir d'un modèle n'est pas recommandée ou une pratique courante?
J'ai vraiment apprécié le paragraphe" Pour éliminer les importations circulaires, vous devriez réfléchir à la manière dont les importations devraient se produire ... ". Je vous remercie. – pawelmech