【问题标题】:Return QuerySet object (mongo) in Celery task在 Celery 任务中返回 QuerySet 对象(mongo)
【发布时间】:2020-11-11 14:55:00
【问题描述】:

我有一个应用程序,其中我使用 Celery 作为任务队列、MongoDB 数据库和 mongoengine 作为 ORM。如果我尝试使用任务从数据库中获取对象并将其转换为 JSON,它可以正常工作。但是,如果我尝试返回一个 QuerySet 对象,则会引发错误。我需要获取 QuerySet 对象,因为我将它用作另一个模型中的 LazyReferenceField

有没有办法做到这一点或从我的任务中获取 QuerySet 对象?

我看到了类似问题的解决方案,建议 Pickle,但也不鼓励这样做。

【问题讨论】:

    标签: python mongodb celery mongoengine


    【解决方案1】:

    我认为尝试序列化 QuerySet 对象是一个糟糕的主意,但请注意,可以使用 ID 设置 (Lazy)ReferenceField,因此也许您可以简单地返回 ID。如果这不起作用,您最好的选择是返回 ID,然后在另一侧加载对象(消耗 celery 输出的对象)

    class Parent(Document):
        name = StringField()
    
    class House(Document):
        owner = ReferenceField(Parent)
    
    p = Parent(name='Bob').save()
    
    House(owner=p.id).save()
    
    h = House.objects.first()
    assert h.owner.name == 'Bob'
    

    【讨论】:

    • 为什么这是个糟糕的主意?
    • 一个查询集对象包含一个 pymongo 游标,所以我怀疑你是否能够(反)序列化它。现在,如果您不需要返回 Queryset 对象,而是需要返回一个列表(文档实例),这可能是可行的,但您可能会遇到 pickle 和 MongoEngine 文档的问题。推荐的方法是返回 JSON 序列化文档或仅返回 ID(如果可能)
    猜你喜欢
    • 2018-10-01
    • 2020-02-03
    • 2017-12-23
    • 2018-01-09
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多