heynemann / motorengine

Motorengine is a port of MongoEngine for Tornado.
http://motorengine.readthedocs.org
204 stars 67 forks source link

different db_field and field in class cause ListField error #64

Closed antmanler closed 10 years ago

antmanler commented 10 years ago
class Order(Document):
        __collection__ = "Order"
        history = ListField(JsonField(), db_field="History")

when create new document, left every field default

Order.objects.create()

then will raise following exception

/usr/local/lib/python2.7/dist-packages/motorengine/queryset.pyc in create(self, callback, alias, **kwargs)
     69         '''
     70         document = self.__klass__(**kwargs)
---> 71         self.save(document=document, callback=callback, alias=alias)
     72 
     73     def handle_save(self, document, callback):

/usr/local/lib/python2.7/dist-packages/motorengine/queryset.pyc in save(self, document, callback, alias)
     99 
    100     def save(self, document, callback, alias=None):
--> 101         if self.validate_document(document):
    102             self.ensure_index(callback=self.indexes_saved_before_save(document, callback, alias))
    103 

/usr/local/lib/python2.7/dist-packages/motorengine/queryset.pyc in validate_document(self, document)
    121             ))
    122 
--> 123         return document.validate()
    124 
    125     def handle_bulk_insert(self, documents, callback):

/usr/local/lib/python2.7/dist-packages/motorengine/document.pyc in validate(self)
     73 
     74     def validate(self):
---> 75         return self.validate_fields()
     76 
     77     def validate_fields(self):

/usr/local/lib/python2.7/dist-packages/motorengine/document.pyc in validate_fields(self)
     82             if field.required and field.is_empty(value):
     83                 raise InvalidDocumentError("Field '%s' is required." % name)
---> 84             if not field.validate(value):
     85                 raise InvalidDocumentError("Field '%s' must be valid." % name)
     86 

/usr/local/lib/python2.7/dist-packages/motorengine/fields/list_field.pyc in validate(self, value)
     33 
     34     def validate(self, value):
---> 35         for item in value:
     36             if not self._base_field.validate(item):
     37                 return False

TypeError: 'NoneType' object is not iterable
antmanler commented 10 years ago

I think the bug is mainly caused by the miss use between db_field and field name defined in class