feat: add dict-like behavior to model class instances
This commit is contained in:
parent
82c043fd05
commit
08689f494f
|
@ -46,7 +46,25 @@ naming_convention = {
|
||||||
|
|
||||||
metadata = sa.MetaData(naming_convention=naming_convention)
|
metadata = sa.MetaData(naming_convention=naming_convention)
|
||||||
|
|
||||||
Base = orm.declarative_base(metadata=metadata)
|
|
||||||
|
class ModelBase:
|
||||||
|
""" """
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
# nb. we override this to allow for `dict(self)`
|
||||||
|
state = sa.inspect(self)
|
||||||
|
fields = [attr.key for attr in state.attrs]
|
||||||
|
return iter([(field, getattr(self, field))
|
||||||
|
for field in fields])
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
# nb. we override this to allow for `x = self['field']`
|
||||||
|
state = sa.inspect(self)
|
||||||
|
if hasattr(state.attrs, key):
|
||||||
|
return getattr(self, key)
|
||||||
|
|
||||||
|
|
||||||
|
Base = orm.declarative_base(metadata=metadata, cls=ModelBase)
|
||||||
|
|
||||||
|
|
||||||
def uuid_column(*args, **kwargs):
|
def uuid_column(*args, **kwargs):
|
||||||
|
|
|
@ -10,6 +10,15 @@ except ImportError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
|
|
||||||
|
class TestModelBase(TestCase):
|
||||||
|
|
||||||
|
def test_dict_behavior(self):
|
||||||
|
setting = model.Setting()
|
||||||
|
self.assertEqual(list(iter(setting)), [('name', None), ('value', None)])
|
||||||
|
self.assertIsNone(setting['name'])
|
||||||
|
setting.name = 'foo'
|
||||||
|
self.assertEqual(setting['name'], 'foo')
|
||||||
|
|
||||||
class TestUUIDColumn(TestCase):
|
class TestUUIDColumn(TestCase):
|
||||||
|
|
||||||
def test_basic(self):
|
def test_basic(self):
|
||||||
|
|
Loading…
Reference in a new issue