Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
591149b1f0 | ||
|
9a0a0b1bd4 | ||
|
89c44cd14e | ||
|
8105bfd8b3 |
@@ -38,39 +38,24 @@ Fields
|
|||||||
======
|
======
|
||||||
|
|
||||||
.. autoclass:: mongoengine.StringField
|
.. autoclass:: mongoengine.StringField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.URLField
|
.. autoclass:: mongoengine.URLField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.EmailField
|
.. autoclass:: mongoengine.EmailField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.IntField
|
.. autoclass:: mongoengine.IntField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.FloatField
|
.. autoclass:: mongoengine.FloatField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.DecimalField
|
.. autoclass:: mongoengine.DecimalField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.BooleanField
|
|
||||||
|
|
||||||
.. autoclass:: mongoengine.DateTimeField
|
.. autoclass:: mongoengine.DateTimeField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.ComplexDateTimeField
|
.. autoclass:: mongoengine.ComplexDateTimeField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.EmbeddedDocumentField
|
|
||||||
|
|
||||||
.. autoclass:: mongoengine.DictField
|
|
||||||
|
|
||||||
.. autoclass:: mongoengine.ListField
|
.. autoclass:: mongoengine.ListField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.SortedListField
|
.. autoclass:: mongoengine.SortedListField
|
||||||
|
.. autoclass:: mongoengine.DictField
|
||||||
.. autoclass:: mongoengine.BinaryField
|
.. autoclass:: mongoengine.MapField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.ObjectIdField
|
.. autoclass:: mongoengine.ObjectIdField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.ReferenceField
|
.. autoclass:: mongoengine.ReferenceField
|
||||||
|
|
||||||
.. autoclass:: mongoengine.GenericReferenceField
|
.. autoclass:: mongoengine.GenericReferenceField
|
||||||
|
.. autoclass:: mongoengine.EmbeddedDocumentField
|
||||||
|
.. autoclass:: mongoengine.GenericEmbeddedDocumentField
|
||||||
|
.. autoclass:: mongoengine.BooleanField
|
||||||
.. autoclass:: mongoengine.FileField
|
.. autoclass:: mongoengine.FileField
|
||||||
|
.. autoclass:: mongoengine.BinaryField
|
||||||
.. autoclass:: mongoengine.GeoPointField
|
.. autoclass:: mongoengine.GeoPointField
|
||||||
|
.. autoclass:: mongoengine.SequenceField
|
||||||
|
@@ -2,8 +2,13 @@
|
|||||||
Changelog
|
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 InvalidDocumentError - so Document core methods can't be overwritten
|
||||||
- Added GenericEmbeddedDocument - so you can embed any type of embeddable document
|
- 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'
|
__author__ = 'Harry Marr'
|
||||||
|
|
||||||
VERSION = (0, 5, 0)
|
VERSION = (0, 5, 1)
|
||||||
|
|
||||||
|
|
||||||
def get_version():
|
def get_version():
|
||||||
|
@@ -40,6 +40,8 @@ class DeReference(object):
|
|||||||
|
|
||||||
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)
|
||||||
|
@@ -920,9 +920,11 @@ class GeoPointField(BaseField):
|
|||||||
|
|
||||||
|
|
||||||
class SequenceField(IntField):
|
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
|
numbers for primary keys. In MongoDB, the preferred approach is to
|
||||||
use Object IDs instead. The concept is that in a very large
|
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
|
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.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):
|
||||||
|
Reference in New Issue
Block a user