【问题标题】:Counting mongoengine ListField elements计数 mongoengine ListField 元素
【发布时间】:2013-08-12 14:13:42
【问题描述】:

我很难将我的模型从使用 MySQL 的标准 Django orm 迁移到 mongoengine-odm

我有以下模型在旧结构中可以正常工作:

class Place(Document):

    name    = StringField()
    acronym = StringField()

    parent = ReferenceField('self')
    hierarchy = ListField(ReferenceField('self'))
    hierarchy_size = IntField()

    @classmethod
    def preSave(instance, sender, **kwargs):
        instance.hierarchy_size = len(instance.hierarchy)

signals.pre_save.connect(Place.preSave, sender=Place)

但是在使用新的 mongoengine 时,我遇到了以以前的方式访问对象层次结构大小的问题。接收:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/awesome_user/workspace/awesome_project/project/models.py", line 728, in importPlacesFromMySQL
    myCountry.save()
  File "/Users/awesome_user/workspace/awesome_project/site_env/lib/python2.7/site-packages/mongoengine/document.py", line 220, in save
    signals.pre_save.send(self.__class__, document=self)
  File "/Users/awesome_user/workspace/awesome_project/site_env/lib/python2.7/site-packages/blinker/base.py", line 267, in send
    for receiver in self.receivers_for(sender)]
  File "/Users/awesome_user/workspace/awesome_project/project/models.py", line 804, in preSave
    instance.hierarchy_size = len(instance.hierarchy)
TypeError: object of type 'ListField' has no len()

有谁知道如何访问实例的属性,例如 length 在我的例子中?

【问题讨论】:

  • len(list(instance.hierarchy)) 有效吗?
  • 不,它返回 -> TypeError: 'ListField' object is not iterable

标签: django django-models mongoengine


【解决方案1】:

您在定义preSave 类方法时出错。您正在尝试从 hierarchy ListField 中获取 len 从 Place 类(不是实例)。这是因为您使用的是方法的第一个参数 - 它不是实例,而是类本身。请改用第三个参数:

@classmethod
def preSave(cls, sender, document, **kwargs):
    document.hierarchy_size = len(document.hierarchy)

【讨论】:

    【解决方案2】:

    len(object.field) 将检索所有子文档然后计数。如果您只想要数组的长度而不检索所有文档,您可以使用len(object.to_mongo()["field"])

    【讨论】:

      猜你喜欢
      • 2014-10-04
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多