Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion colanderalchemy/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
28 changes: 28 additions & 0 deletions tests/test_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
"""
Expand Down