2017-08-26 83 views
-1

对芹菜完全陌生并想知道是否可以在芹菜任务内的表上运行查询?是否有可能在芹菜的tasks.py中执行查询

芹菜是工作,我可以排队的工作,但是,我想这和它给出了一个错误:

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 

错误:

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

我究竟做错了什么?

编辑

是我试图去通过ID的(在一个CSV文件输入)的名单,我想电子邮件地址添加到该ID,并写在一个新的CSV事情文件。 ID /电子邮件关系在我的psql xlink数据库模型中。

查找的整个想法不是返回一个对象。我想有一个任务在我的psql数据库中进行查找(与模型相关),并从该特定搜索中选择一个值。

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") 

我想返回基于MEMBER_ID我把任务的MEMBER_PRIMARY_EMAIL地址。

+0

你不能从任务返回一个对象。你必须返回可序列化的东西。就像你可以将你的对象转换成json –

+0

我编辑我的问题,所以它更清晰。我不想返回一个对象persé。 – radzia2

+0

那你究竟回来了什么?它是成员主要电子邮件地址的列表吗?如果是这样,那么下面的答案将工作 –

回答

0

芹菜文档

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.

所以你不能从芹菜工人返回一个对象。

解决方案

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) 
相关问题