2013-08-12 2 views
1

Мне трудно переносить свои модели из стандартного Django orm с MySQL на mongoengine-odm.Подсчет mongoengine Элементы ListField

У меня есть следующая модель, которая отлично работает в старой структуре:

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() 

Кто-нибудь знает, как получить доступ к свойствам экземпляра, как длины в моем случае?

+0

Выполняется ли len (list (instance.hierarchy)) '? – alecxe

+0

Нет, он возвращает -> TypeError: объект ListField не является итерабельным –

ответ

1

Вы ошиблись в определении preSave classmethod. Вы пытаетесь взять len от hierarchyListField от Place класс (не экземпляр). Это связано с тем, что вы используете первый аргумент метода - это не экземпляр, это сам класс. Вместо этого используйте третий аргумент:

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

Thats it ... Спасибо большое! –

Смежные вопросы