new method on orm class populate_defaults(), which runs at the beginning of save(), since populating them in __init__() is problematic

This commit is contained in:
Noah Levitt 2017-03-07 12:44:52 -08:00
parent 07bc01cbbd
commit 3fd2e5cf60
4 changed files with 34 additions and 2 deletions

View File

@ -51,7 +51,7 @@ Usage Example
doc1 = MyTable(rr, {'animal': 'elephant', 'size': 'large'}) doc1 = MyTable(rr, {'animal': 'elephant', 'size': 'large'})
doc1.save() doc1.save()
doc1_copy = MyTable.get(rr, doc1.id) doc1_copy = MyTable.load(rr, doc1.id)
doc1_copy.food = 'bread' doc1_copy.food = 'bread'
doc1_copy.save() doc1_copy.save()

View File

@ -273,6 +273,14 @@ class Document(dict, object):
''' '''
return getattr(self, self.pk_field) return getattr(self, self.pk_field)
def populate_defaults(self):
'''
This method is called by `save()` before persisting the document to
the database. Subclasses should override it to populate default values
if appropriate.
'''
pass
def save(self): def save(self):
''' '''
Persist changes to rethinkdb. Updates only the fields that have Persist changes to rethinkdb. Updates only the fields that have
@ -285,6 +293,7 @@ class Document(dict, object):
touched. touched.
''' '''
should_insert = False should_insert = False
self.populate_defaults()
try: try:
self[self.pk_field] # raises KeyError if missing self[self.pk_field] # raises KeyError if missing
if self._updates: if self._updates:

View File

@ -3,7 +3,7 @@ import codecs
setuptools.setup( setuptools.setup(
name='doublethink', name='doublethink',
version='0.2.0.dev69', version='0.2.0.dev70',
packages=['doublethink'], packages=['doublethink'],
classifiers=[ classifiers=[
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',

View File

@ -279,4 +279,27 @@ def test_orm_pk(rr):
assert e['blah'] == 'toot' assert e['blah'] == 'toot'
assert e == e_copy assert e == e_copy
def test_default_values(rr):
class Person(doublethink.Document):
def populate_defaults(self):
if not "age" in self:
self.age = 0 # born today
Person.table_ensure(rr)
p = Person(rr, {})
assert not "age" in p
assert p.age is None
p.save()
assert p.age == 0
assert p.id
p.age = 50
p.save()
q = Person.load(rr, p.id)
assert q.age == 50
q.save()
assert q.age == 50
q.refresh()
assert q.age == 50