2017-08-26 5 views
-1

Totalement nouveau à céleri et se demandant si vous pouvez exécuter une requête sur une table dans une tâche de céleri?est-il possible de faire une requête à l'intérieur d'un tasks.py avec céleri

céleri travaille et je peux la file d'attente des emplois, cependant, j'ai essayé cela et il donne une erreur:

import celery 
from celery import shared_task 

from django.shortcuts import get_object_or_404 
from frontendapp.models import xlinkdatabase 

@shared_task 
def lookup(lookup_id): 
    look_up_result = get_object_or_404(xlinkdatabase,MEMBER_ID=lookup_id) 
    return look_up_result 

erreur:

kombu.exceptions.EncodeError: Object of type 'xlinkdatabase' is not JSON serializable 

ce que je fais mal?

EDIT

La chose est que je suis en train de passer par une liste de (l'entrée dans un fichier csv) d'ID et je veux ajouter l'adresse e-mail à cet ID et d'écrire que, dans un nouveau format CSV fichier. La relation ID/e-mail est dans mon modèle psql xlinkdatabase.

L'idée générale d'une recherche n'est pas de retourner un objet. Je veux avoir une tâche qui fait une recherche dans ma base de données psql (liée au modèle) et choisit une valeur de cette recherche spécifique.

models.py:

class xlinkdatabase(models.Model): 
    uniqueid = models.AutoField(primary_key=True) 
    MEMBER_ID = models.DecimalField(verbose_name="Member id",max_digits=19, decimal_places=0,default=Decimal('0')) 
    MEMBER_PRIMARY_EMAIL = models.CharField(verbose_name="Email address", max_length = 150, default="not set") 

Je veux retourner l'adresse MEMBER_PRIMARY_EMAIL sur la base MEMBER_ID je mets dans la tâche.

+0

Vous ne pouvez pas retourner un objet de la tâche. Vous devez retourner quelque chose qui est sérialisable. Comme vous pouvez convertir votre objet à json –

+0

J'ai édité ma question afin qu'elle soit plus claire. Je ne veux pas retourner un objet persé. – radzia2

+0

alors qu'est-ce que vous retournez exactement? Est-ce une liste d'adresses e-mail principales des membres? Si oui alors aussi la réponse ci-dessous fonctionnera –

Répondre

0

De céleri docs

Data transferred between clients and workers needs to be serialized, so every message in Celery has a content_type header that describes the serialization method used to encode it.

vous ne pouvez donc pas renvoyer un objet du travailleur de céleri.

Solution:

from django.core import serializers 
import celery 
from celery import shared_task 

from django.shortcuts import get_object_or_404 
from frontendapp.models import xlinkdatabase 

@shared_task 
def lookup(lookup_id): 
    look_up_result = get_object_or_404(xlinkdatabase,MEMBER_ID=lookup_id) 
    return serializers.serialize("json", look_up_result)