【问题标题】:mongoengine cannot use collection in responsemongoengine 无法使用集合作为响应
【发布时间】:2018-02-27 14:04:21
【问题描述】:

[编辑]

我有任何使用flask + connexion (swagger 2.0)的api

任何时候我从数据库中检索一个集合,使用简单的代码,例如:

# GET /api/model
def get_all_model():
    return Model.objects

我收到以下错误:

TypeError: [Model] 不是 JSON 可序列化的

作为一种解决方法,我做了以下操作

def get_all_model():
    return json.loads(model.objects.to_json())

如何在不序列化/反序列化的情况下返回整个集合?

来自文档:

文档类有一个对象属性,用于 访问与该类关联的数据库中的对象。 该 objects 属性实际上是一个 QuerySetManager,它创建和 在访问时返回一个新的 QuerySet 对象。 QuerySet 对象可能是 迭代以从数据库中获取文档:

【问题讨论】:

    标签: python mongodb flask swagger mongoengine


    【解决方案1】:

    现在问题很清楚了。我认为没有办法返回列表而不是查询集来将其直接序列化为 JSON。不过,您应该通过遍历所有文档(使用 queryset 对象)并将它们放在字典列表中来自己完成。我建议这样做:

    import mongoengine
    
    mongoengine.connect('mongoenginetest', host='mongomock://localhost')
    
    class Student(mongoengine.Document):
        name = mongoengine.StringField()
    
        @mongoengine.queryset_manager
        def serialized_objects(doc_cls, queryset):
            return [{'name': doc.name} for doc in queryset]
    
    student1 = Student(name='John')
    student1.save()
    
    print(type(Student.serialized_objects))  # prints <class 'list'>
    print(Student.serialized_objects)  # prints [{'name': 'John'}]
    

    您可以将 serialized_objects 重命名为对象。另外,看看这个页面:https://gist.github.com/benwah/3009143

    快乐的一天!

    【讨论】:

    • 我已将问题编辑得更清楚。我试图避免必须序列化然后反序列化,因为这是不必要的工作。应该有一种方法可以将项目作为 python 字典获取?我以为as_pymongo() 会这样做,但似乎并非如此
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多