diff --git a/colanderalchemy/schema.py b/colanderalchemy/schema.py index 4925e76..a28059f 100644 --- a/colanderalchemy/schema.py +++ b/colanderalchemy/schema.py @@ -695,7 +695,10 @@ def objectify(self, dict_, context=None): for obj in dict_[attr]] else: # Single object - value = self[attr].objectify(dict_[attr]) + if dict_[attr] is colander.null: + value = None + else: + value = self[attr].objectify(dict_[attr]) else: value = dict_[attr] if value is colander.null: diff --git a/tests/test_schema.py b/tests/test_schema.py index 4158e9b..babd636 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -528,6 +528,34 @@ class Person(Base): self.assertEqual(person.fullname, None) self.assertEqual(person.age, None) + def test_objectify_null(self): + """ Make sure that `colander.null` is replaced with `None` for + mapped schemas. + """ + Base = declarative_base() + + class DocumentGeometry(Base): + __tablename__ = 'document_geometries' + id = Column(Integer, primary_key=True) + document_id = Column( + Integer, ForeignKey('documents.document_id'), + nullable=False) + geom = Column(String) + + class Document(Base): + __tablename__ = 'documents' + + document_id = Column(Integer, primary_key=True) + geometry = relationship(DocumentGeometry, uselist=False) + + schema = SQLAlchemySchemaNode(Document) + + dict_ = schema.dictify(Document(geometry=None)) + self.assertEqual(dict_['geometry'], colander.null) + + obj = schema.objectify(dict_) + self.assertEqual(obj.geometry, None) + def test_objectify_context(self): """ Test converting a data structure into objects, using a context. """