Dynamic Fields store and recompose Embedded Documents / Documents correctly (#449)
This commit is contained in:
parent
5bcc454678
commit
d07a9d2ef8
@ -4,6 +4,7 @@ Changelog
|
|||||||
|
|
||||||
Changes in 0.8.4
|
Changes in 0.8.4
|
||||||
================
|
================
|
||||||
|
- Dynamic Fields store and recompose Embedded Documents / Documents correctly (#449)
|
||||||
- Handle dynamic fieldnames that look like digits (#434)
|
- Handle dynamic fieldnames that look like digits (#434)
|
||||||
- Added get_user_document and improve mongo_auth module (#423)
|
- Added get_user_document and improve mongo_auth module (#423)
|
||||||
- Added str representation of GridFSProxy (#424)
|
- Added str representation of GridFSProxy (#424)
|
||||||
|
@ -624,7 +624,9 @@ class DynamicField(BaseField):
|
|||||||
cls = value.__class__
|
cls = value.__class__
|
||||||
val = value.to_mongo()
|
val = value.to_mongo()
|
||||||
# If we its a document thats not inherited add _cls
|
# If we its a document thats not inherited add _cls
|
||||||
if (isinstance(value, (Document, EmbeddedDocument))):
|
if (isinstance(value, Document)):
|
||||||
|
val = {"_ref": value.to_dbref(), "_cls": cls.__name__}
|
||||||
|
if (isinstance(value, EmbeddedDocument)):
|
||||||
val['_cls'] = cls.__name__
|
val['_cls'] = cls.__name__
|
||||||
return val
|
return val
|
||||||
|
|
||||||
@ -645,6 +647,15 @@ class DynamicField(BaseField):
|
|||||||
value = [v for k, v in sorted(data.iteritems(), key=itemgetter(0))]
|
value = [v for k, v in sorted(data.iteritems(), key=itemgetter(0))]
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def to_python(self, value):
|
||||||
|
if isinstance(value, dict) and '_cls' in value:
|
||||||
|
doc_cls = get_document(value['_cls'])
|
||||||
|
if '_ref' in value:
|
||||||
|
value = doc_cls._get_db().dereference(value['_ref'])
|
||||||
|
return doc_cls._from_son(value)
|
||||||
|
|
||||||
|
return super(DynamicField, self).to_python(value)
|
||||||
|
|
||||||
def lookup_member(self, member_name):
|
def lookup_member(self, member_name):
|
||||||
return member_name
|
return member_name
|
||||||
|
|
||||||
|
@ -2506,5 +2506,46 @@ class FieldTest(unittest.TestCase):
|
|||||||
self.assertTrue(tuple(x.items[0]) in tuples)
|
self.assertTrue(tuple(x.items[0]) in tuples)
|
||||||
self.assertTrue(x.items[0] in tuples)
|
self.assertTrue(x.items[0] in tuples)
|
||||||
|
|
||||||
|
def test_dynamic_fields_class(self):
|
||||||
|
|
||||||
|
class Doc2(Document):
|
||||||
|
field_1 = StringField(db_field='f')
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
my_id = IntField(required=True, unique=True, primary_key=True)
|
||||||
|
embed_me = DynamicField(db_field='e')
|
||||||
|
field_x = StringField(db_field='x')
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
Doc2.drop_collection()
|
||||||
|
|
||||||
|
doc2 = Doc2(field_1="hello")
|
||||||
|
doc = Doc(my_id=1, embed_me=doc2, field_x="x")
|
||||||
|
self.assertRaises(OperationError, doc.save)
|
||||||
|
|
||||||
|
doc2.save()
|
||||||
|
doc.save()
|
||||||
|
|
||||||
|
doc = Doc.objects.get()
|
||||||
|
self.assertEqual(doc.embed_me.field_1, "hello")
|
||||||
|
|
||||||
|
def test_dynamic_fields_embedded_class(self):
|
||||||
|
|
||||||
|
class Embed(EmbeddedDocument):
|
||||||
|
field_1 = StringField(db_field='f')
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
my_id = IntField(required=True, unique=True, primary_key=True)
|
||||||
|
embed_me = DynamicField(db_field='e')
|
||||||
|
field_x = StringField(db_field='x')
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
|
||||||
|
Doc(my_id=1, embed_me=Embed(field_1="hello"), field_x="x").save()
|
||||||
|
|
||||||
|
doc = Doc.objects.get()
|
||||||
|
self.assertEqual(doc.embed_me.field_1, "hello")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user