【问题标题】:MongoEngine: 'ListField' object has no attribute 'in_bulk'MongoEngine:“ListField”对象没有属性“in_bulk”
【发布时间】:2021-01-05 21:38:35
【问题描述】:

鉴于以下设置(简化):

class Parent(db.Document):
    _id = db.ObjectIdField(required=True, default=lambda: ObjectId(), primary_key=True)
    name = db.StringField(required=False)
    test = db.MapField(db.EmbeddedDocumentField('Child'), required=False)
    
class Child(db.EmbeddedDocument):
    _id = db.ObjectIdField(required=True, default=lambda: ObjectId(), primary_key=True)
    ref = db.ReferenceField('Parent')
    
parent = Parent.objects(_id=x).first()
return jsonify(parent.test)

我收到以下错误:AttributeError: 'ListField' object has no attribute 'in_bulk'

  File "/home/me/testSetup/test.py", line 310, in get
    return jsonify(parent.test)
  File "/home/me/lib/python3.7/site-packages/mongoengine/base/fields.py", line 329, in __get__
    value = _dereference(value, max_depth=1, instance=instance, name=self.name)
  File "/home/me/lib/python3.7/site-packages/mongoengine/dereference.py", line 97, in __call__
    self.object_map = self._fetch_objects(doc_type=doc_type)
  File "/home/me/lib/python3.7/site-packages/mongoengine/dereference.py", line 174, in _fetch_objects
    references = collection.objects.in_bulk(refs)
AttributeError: 'ListField' object has no attribute 'in_bulk'

我不太清楚为什么会这样。我根本没有使用 ListField。我可以访问name_id,并且此设置以前与其他类一起使用。 return jsonify(parent) 也可以工作,它包含 test 字段及其所有值。有人有想法吗?

编辑:我很傻,从简化示例中删除/审查了导致错误的部分。字段test 实际上被称为objects。重命名它解决了错误。

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    使用原始的 mongoengine(没有 flask-mongoengine),从一个新的数据库和一个简单的终端,下面的代码正在工作

    from mongoengine import *
    from bson import ObjectId
    
    connect("testdb")
    
    class Parent(Document):
        _id = ObjectIdField(required=True, default=lambda: ObjectId(), primary_key=True)
        name = StringField(required=False)
        test = MapField(EmbeddedDocumentField('Child'), required=False)
        
    class Child(EmbeddedDocument):
        _id = ObjectIdField(required=True, default=lambda: ObjectId(), primary_key=True)
        ref = ReferenceField('Parent')
    
    p = Parent(name='aa', test={}).save()
    p2 = Parent(name='bb', test={'test': Child(ref=p), 'test2': Child(ref=p)}).save()
    
    print(Parent.objects(_id=p.id).first().test)
    
    print(Parent.objects(_id=p2.id).first().test)
    

    我建议你从那里开始,添加更复杂的代码,直到你能查明导致它崩溃的原因。

    旁注,由于 ObjectId 是可调用的,因此您不需要将其包装在 lambda 中,并且可以在字段定义中简单地使用 default=ObjectId,因此 ObjectIdField(required=True, default=ObjectId, primary_key=True)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2012-12-07
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      相关资源
      最近更新 更多