parent
89c44cd14e
commit
9a0a0b1bd4
@ -2,6 +2,11 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
Changes in v0.5.1
|
||||||
|
=================
|
||||||
|
|
||||||
|
- Circular reference bugfix
|
||||||
|
|
||||||
Changes in v0.5
|
Changes in v0.5
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
@ -33,13 +33,15 @@ class DeReference(object):
|
|||||||
items = [i for i in items]
|
items = [i for i in items]
|
||||||
|
|
||||||
self.max_depth = max_depth
|
self.max_depth = max_depth
|
||||||
|
|
||||||
doc_type = None
|
doc_type = None
|
||||||
if instance and instance._fields:
|
if instance and instance._fields:
|
||||||
doc_type = instance._fields[name].field
|
doc_type = instance._fields[name].field
|
||||||
|
|
||||||
if isinstance(doc_type, ReferenceField):
|
if isinstance(doc_type, ReferenceField):
|
||||||
doc_type = doc_type.document_type
|
doc_type = doc_type.document_type
|
||||||
|
if all([i.__class__ == doc_type for i in items]):
|
||||||
|
return items
|
||||||
|
|
||||||
self.reference_map = self._find_references(items)
|
self.reference_map = self._find_references(items)
|
||||||
self.object_map = self._fetch_objects(doc_type=doc_type)
|
self.object_map = self._fetch_objects(doc_type=doc_type)
|
||||||
|
@ -129,6 +129,65 @@ class FieldTest(unittest.TestCase):
|
|||||||
self.assertEquals(employee.friends, friends)
|
self.assertEquals(employee.friends, friends)
|
||||||
self.assertEqual(q, 2)
|
self.assertEqual(q, 2)
|
||||||
|
|
||||||
|
def test_circular_reference(self):
|
||||||
|
"""Ensure you can handle circular references
|
||||||
|
"""
|
||||||
|
class Person(Document):
|
||||||
|
name = StringField()
|
||||||
|
relations = ListField(EmbeddedDocumentField('Relation'))
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Person: %s>" % self.name
|
||||||
|
|
||||||
|
class Relation(EmbeddedDocument):
|
||||||
|
name = StringField()
|
||||||
|
person = ReferenceField('Person')
|
||||||
|
|
||||||
|
Person.drop_collection()
|
||||||
|
mother = Person(name="Mother")
|
||||||
|
daughter = Person(name="Daughter")
|
||||||
|
|
||||||
|
mother.save()
|
||||||
|
daughter.save()
|
||||||
|
|
||||||
|
daughter_rel = Relation(name="Daughter", person=daughter)
|
||||||
|
mother.relations.append(daughter_rel)
|
||||||
|
mother.save()
|
||||||
|
|
||||||
|
mother_rel = Relation(name="Daughter", person=mother)
|
||||||
|
self_rel = Relation(name="Self", person=daughter)
|
||||||
|
daughter.relations.append(mother_rel)
|
||||||
|
daughter.relations.append(self_rel)
|
||||||
|
daughter.save()
|
||||||
|
|
||||||
|
self.assertEquals("[<Person: Mother>, <Person: Daughter>]", "%s" % Person.objects())
|
||||||
|
|
||||||
|
def test_circular_reference_on_self(self):
|
||||||
|
"""Ensure you can handle circular references
|
||||||
|
"""
|
||||||
|
class Person(Document):
|
||||||
|
name = StringField()
|
||||||
|
relations = ListField(ReferenceField('self'))
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Person: %s>" % self.name
|
||||||
|
|
||||||
|
Person.drop_collection()
|
||||||
|
mother = Person(name="Mother")
|
||||||
|
daughter = Person(name="Daughter")
|
||||||
|
|
||||||
|
mother.save()
|
||||||
|
daughter.save()
|
||||||
|
|
||||||
|
mother.relations.append(daughter)
|
||||||
|
mother.save()
|
||||||
|
|
||||||
|
daughter.relations.append(mother)
|
||||||
|
daughter.relations.append(daughter)
|
||||||
|
daughter.save()
|
||||||
|
|
||||||
|
self.assertEquals("[<Person: Mother>, <Person: Daughter>]", "%s" % Person.objects())
|
||||||
|
|
||||||
def test_generic_reference(self):
|
def test_generic_reference(self):
|
||||||
|
|
||||||
class UserA(Document):
|
class UserA(Document):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user