Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
591149b1f0 | ||
|
9a0a0b1bd4 | ||
|
89c44cd14e | ||
|
8105bfd8b3 |
@@ -15,12 +15,12 @@ Documents
|
||||
|
||||
.. attribute:: objects
|
||||
|
||||
A :class:`~mongoengine.queryset.QuerySet` object that is created lazily
|
||||
A :class:`~mongoengine.queryset.QuerySet` object that is created lazily
|
||||
on access.
|
||||
|
||||
.. autoclass:: mongoengine.EmbeddedDocument
|
||||
:members:
|
||||
|
||||
|
||||
.. autoclass:: mongoengine.document.MapReduceDocument
|
||||
:members:
|
||||
|
||||
@@ -31,46 +31,31 @@ Querying
|
||||
:members:
|
||||
|
||||
.. automethod:: mongoengine.queryset.QuerySet.__call__
|
||||
|
||||
|
||||
.. autofunction:: mongoengine.queryset.queryset_manager
|
||||
|
||||
Fields
|
||||
======
|
||||
|
||||
.. autoclass:: mongoengine.StringField
|
||||
|
||||
.. autoclass:: mongoengine.URLField
|
||||
|
||||
.. autoclass:: mongoengine.EmailField
|
||||
|
||||
.. autoclass:: mongoengine.IntField
|
||||
|
||||
.. autoclass:: mongoengine.FloatField
|
||||
|
||||
.. autoclass:: mongoengine.DecimalField
|
||||
|
||||
.. autoclass:: mongoengine.BooleanField
|
||||
|
||||
.. autoclass:: mongoengine.DateTimeField
|
||||
|
||||
.. autoclass:: mongoengine.ComplexDateTimeField
|
||||
|
||||
.. autoclass:: mongoengine.EmbeddedDocumentField
|
||||
|
||||
.. autoclass:: mongoengine.DictField
|
||||
|
||||
.. autoclass:: mongoengine.ListField
|
||||
|
||||
.. autoclass:: mongoengine.SortedListField
|
||||
|
||||
.. autoclass:: mongoengine.BinaryField
|
||||
|
||||
.. autoclass:: mongoengine.DictField
|
||||
.. autoclass:: mongoengine.MapField
|
||||
.. autoclass:: mongoengine.ObjectIdField
|
||||
|
||||
.. autoclass:: mongoengine.ReferenceField
|
||||
|
||||
.. autoclass:: mongoengine.GenericReferenceField
|
||||
|
||||
.. autoclass:: mongoengine.EmbeddedDocumentField
|
||||
.. autoclass:: mongoengine.GenericEmbeddedDocumentField
|
||||
.. autoclass:: mongoengine.BooleanField
|
||||
.. autoclass:: mongoengine.FileField
|
||||
|
||||
.. autoclass:: mongoengine.BinaryField
|
||||
.. autoclass:: mongoengine.GeoPointField
|
||||
.. autoclass:: mongoengine.SequenceField
|
||||
|
@@ -2,8 +2,13 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
Changes in dev
|
||||
==============
|
||||
Changes in v0.5.1
|
||||
=================
|
||||
|
||||
- Circular reference bugfix
|
||||
|
||||
Changes in v0.5
|
||||
===============
|
||||
|
||||
- Added InvalidDocumentError - so Document core methods can't be overwritten
|
||||
- Added GenericEmbeddedDocument - so you can embed any type of embeddable document
|
||||
|
@@ -14,7 +14,7 @@ __all__ = (document.__all__ + fields.__all__ + connection.__all__ +
|
||||
|
||||
__author__ = 'Harry Marr'
|
||||
|
||||
VERSION = (0, 5, 0)
|
||||
VERSION = (0, 5, 1)
|
||||
|
||||
|
||||
def get_version():
|
||||
|
@@ -33,13 +33,15 @@ class DeReference(object):
|
||||
items = [i for i in items]
|
||||
|
||||
self.max_depth = max_depth
|
||||
|
||||
|
||||
doc_type = None
|
||||
if instance and instance._fields:
|
||||
doc_type = instance._fields[name].field
|
||||
|
||||
|
||||
if isinstance(doc_type, ReferenceField):
|
||||
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.object_map = self._fetch_objects(doc_type=doc_type)
|
||||
|
@@ -920,9 +920,11 @@ class GeoPointField(BaseField):
|
||||
|
||||
|
||||
class SequenceField(IntField):
|
||||
"""Provides a sequental counter.
|
||||
"""Provides a sequental counter (see http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-SequenceNumbers)
|
||||
|
||||
..note:: Although traditional databases often use increasing sequence
|
||||
.. note::
|
||||
|
||||
Although traditional databases often use increasing sequence
|
||||
numbers for primary keys. In MongoDB, the preferred approach is to
|
||||
use Object IDs instead. The concept is that in a very large
|
||||
cluster of machines, it is easier to create an object ID than have
|
||||
|
@@ -129,6 +129,65 @@ class FieldTest(unittest.TestCase):
|
||||
self.assertEquals(employee.friends, friends)
|
||||
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):
|
||||
|
||||
class UserA(Document):
|
||||
|
Reference in New Issue
Block a user