django - 计算 mongoengine ListField 元素

标签 django django-models mongoengine

我很难将我的模型从带有 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()

有谁知道如何访问实例的属性,例如我的例子中的长度

最佳答案

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

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

关于django - 计算 mongoengine ListField 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18189246/

相关文章:

python - 一对一字段 Django Admin

python - 如何在 View 集中获取自定义列表

mysql - Django 迁移创建不同的表名称

python - MongoEngine 中的经典映射

python - 为什么 Flask + Mongoengine 不允许显示与数据库模型不完全对应的数据库项?

flask - 蒙戈引擎 : How to update specific fields of an existing document?

django - 设置 Django 将整数字段最小值设置为 1

Django:显示模板中相关项目的总和

Django 总是尝试与本地主机建立 SSL 连接

MySQL 将枚举值转换为整数值