added support for GenericReferenceField to ListField. could be cleaner, perhaps.

This commit is contained in:
blackbrrr 2010-02-26 17:38:38 -06:00
parent 03d31b1890
commit 018b206177
2 changed files with 51 additions and 64 deletions

View File

@ -211,13 +211,15 @@ class ListField(BaseField):
def __get__(self, instance, owner): def __get__(self, instance, owner):
"""Descriptor to automatically dereference references. """Descriptor to automatically dereference references.
""" """
global _model_registry
if instance is None: if instance is None:
# Document class being used rather than a document object # Document class being used rather than a document object
return self return self
if isinstance(self.field, (ReferenceField, GenericReferenceField)): if isinstance(self.field, ReferenceField):
referenced_type = self.field.document_type referenced_type = self.field.document_type
# Get value from document instance if available # Get value from document instance if available
value_list = instance._data.get(self.name) value_list = instance._data.get(self.name)
if value_list: if value_list:
deref_list = [] deref_list = []
@ -230,19 +232,19 @@ class ListField(BaseField):
deref_list.append(value) deref_list.append(value)
instance._data[self.name] = deref_list instance._data[self.name] = deref_list
# if isinstance(self.field, GenericReferenceField): if isinstance(self.field, GenericReferenceField):
# value_list = instance._data.get(self.name) value_list = instance._data.get(self.name)
# if value_list: if value_list:
# deref_list = [] deref_list = []
# for value in value_list: for value in value_list:
# # Dereference DBRefs # Dereference DBRefs
# if isinstance(value, pymongo.dbref.DBRef): if isinstance(value, pymongo.dbref.DBRef):
# value = _get_db().dereference(value) value = _get_db().dereference(value)
# referenced_type = value. referenced_type = _model_registry[value['_cls']]
# deref_list.append() deref_list.append(referenced_type._from_son(value))
# else: else:
# deref_list.append(value) deref_list.append(value)
# instance._data[self.name] = deref_list instance._data[self.name] = deref_list
return super(ListField, self).__get__(instance, owner) return super(ListField, self).__get__(instance, owner)

View File

@ -392,55 +392,40 @@ class FieldTest(unittest.TestCase):
Post.drop_collection() Post.drop_collection()
Bookmark.drop_collection() Bookmark.drop_collection()
# def test_generic_reference_list(self): def test_generic_reference_list(self):
# """Ensure that a ListField properly dereferences """Ensure that a ListField properly dereferences
# relationships to *any* model via GenericReferenceField. relationships to *any* model via GenericReferenceField.
# """ """
# class Link(Document): class Link(Document):
# title = StringField() title = StringField()
#
# class Post(Document): class Post(Document):
# title = StringField() title = StringField()
#
# class User(Document): class User(Document):
# bookmarks = ListField(GenericReferenceField()) bookmarks = ListField(GenericReferenceField())
#
# Link.drop_collection() Link.drop_collection()
# Post.drop_collection() Post.drop_collection()
# User.drop_collection() User.drop_collection()
#
# link_1 = Link(title="Pitchfork") link_1 = Link(title="Pitchfork")
# link_1.save() link_1.save()
#
# post_1 = Post(title="Behind the Scenes of the Pavement Reunion") post_1 = Post(title="Behind the Scenes of the Pavement Reunion")
# post_1.save() post_1.save()
#
# user = User(bookmarks=[post_1, link_1]) user = User(bookmarks=[post_1, link_1])
# user.save() user.save()
#
# del user user.reload()
#
# user = User.objects().first() self.assertEqual(user.bookmarks[0], post_1)
# print user.bookmarks self.assertEqual(user.bookmarks[1], link_1)
#
# # print dir(user) Link.drop_collection()
# Post.drop_collection()
# # self.assertEqual(bm.bookmark_object, post_1) User.drop_collection()
# # self.assertEqual(bm._data['bookmark_object'].__class__,
# # pymongo.dbref.DBRef)
# #
# # bm.bookmark_object = link_1
# # bm.save()
# #
# # bm.reload()
# #
# # self.assertEqual(bm.bookmark_object, link_1)
# # self.assertEqual(bm._data['bookmark_object'].__class__,
# # pymongo.dbref.DBRef)
#
# Link.drop_collection()
# Post.drop_collection()
# User.drop_collection()
if __name__ == '__main__': if __name__ == '__main__':