new save() method updates only dirty fields. fixes issue #18

This commit is contained in:
Florian Schlachter
2010-01-31 14:40:00 +01:00
parent 7d6e117f68
commit 431f006751
4 changed files with 36 additions and 8 deletions

View File

@@ -15,13 +15,14 @@ class BaseField(object):
_index_with_types = True
def __init__(self, name=None, required=False, default=None, unique=False,
unique_with=None, primary_key=False):
unique_with=None, primary_key=False, modified=False):
self.name = name if not primary_key else '_id'
self.required = required or primary_key
self.default = default
self.unique = bool(unique or unique_with)
self.unique_with = unique_with
self.primary_key = primary_key
self.modified = modified
def __get__(self, instance, owner):
"""Descriptor for retrieving a value from a field in a document. Do
@@ -44,6 +45,7 @@ class BaseField(object):
"""Descriptor for assigning a value to a field in a document.
"""
instance._data[self.name] = value
self.modified = True
def to_python(self, value):
"""Convert a MongoDB-compatible type to a Python type.
@@ -252,8 +254,11 @@ class BaseDocument(object):
def __init__(self, **values):
self._data = {}
modified = 'id' in values.keys()
# Assign initial values to instance
for attr_name, attr_value in self._fields.items():
attr_value.modified = modified
if attr_name in values:
setattr(self, attr_name, values.pop(attr_name))
else:
@@ -381,9 +386,9 @@ class BaseDocument(object):
# that has been queried to return this SON
return None
cls = subclasses[class_name]
for field_name, field in cls._fields.items():
if field.name in data:
data[field_name] = field.to_python(data[field.name])
return cls(**data)
return cls(**data)