【问题标题】:is it possible to do a query inside a tasks.py with celery是否可以使用 celery 在 tasks.py 中进行查询
【发布时间】:2018-02-04 09:33:18
【问题描述】:

对 celery 完全陌生,想知道您是否可以在 celery 任务中的表上运行查询?

celery 正在工作,我可以将作业排队,但是,我尝试了这个,它给出了一个错误:

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/e-mail 关系在我的 psql xlinkdatabase 模型中。

查找的整个想法不是返回一个对象。我希望有一项任务在我的 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地址。

【问题讨论】:

  • 您不能从任务中返回对象。您必须返回可序列化的内容。就像您可以将对象转换为 json 一样
  • 我编辑了我的问题,以便更清楚。我不想直接返回一个对象。
  • 那么你到底要返​​回什么?它是成员主要电子邮件地址的列表吗?如果是这样,那么下面的答案也将起作用
  • 感谢帮助,确实不可能返回对象,只能返回一部分,或者列表。

标签: python django celery


【解决方案1】:

来自 celery 文档

客户端和worker之间传输的数据需要序列化,因此Celery中的每条消息都有一个content_type头,描述了用于对其进行编码的序列化方法。

所以你不能从 celery worker 返回一个对象。

解决方案

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)

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多