From 81dd5adccfbdf5cfa48c207a0ce65d408afbfcce Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Sun, 28 Feb 2010 21:30:54 +0000 Subject: [PATCH] GenericReferenceField docs --- docs/guide/defining-documents.rst | 28 ++++++++++++++++++++++++++++ mongoengine/base.py | 6 +++--- tests/fields.py | 2 ++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/docs/guide/defining-documents.rst b/docs/guide/defining-documents.rst index 0862ffd0..bb0d6c81 100644 --- a/docs/guide/defining-documents.rst +++ b/docs/guide/defining-documents.rst @@ -35,14 +35,17 @@ to retrieve the value (such as in the above example). The field types available are as follows: * :class:`~mongoengine.StringField` +* :class:`~mongoengine.URLField` * :class:`~mongoengine.IntField` * :class:`~mongoengine.FloatField` +* :class:`~mongoengine.DecimalField` * :class:`~mongoengine.DateTimeField` * :class:`~mongoengine.ListField` * :class:`~mongoengine.DictField` * :class:`~mongoengine.ObjectIdField` * :class:`~mongoengine.EmbeddedDocumentField` * :class:`~mongoengine.ReferenceField` +* :class:`~mongoengine.GenericReferenceField` List fields ----------- @@ -117,6 +120,31 @@ field:: The :class:`User` object is automatically turned into a reference behind the scenes, and dereferenced when the :class:`Page` object is retrieved. +Generic reference fields +'''''''''''''''''''''''' +A second kind of reference field also exists, +:class:`~mongoengine.GenericReferenceField`. This allows you to reference any +kind of :class:`~mongoengine.Document`, and hence doesn't take a +:class:`~mongoengine.Document` subclass as a constructor argument:: + + class Link(Document): + url = StringField() + + class Post(Document): + title = StringField() + + class Bookmark(Document): + bookmark_object = GenericReferenceField() + + link = Link(url='http://hmarr.com/mongoengine/') + link.save() + + post = Post(title='Using MongoEngine') + post.save() + + Bookmark(bookmark_object=link).save() + Bookmark(bookmark_object=post).save() + Uniqueness constraints ---------------------- MongoEngine allows you to specify that a field should be unique across a diff --git a/mongoengine/base.py b/mongoengine/base.py index a2027411..02c3e661 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -398,7 +398,7 @@ class BaseDocument(object): return obj def __eq__(self, other): - assert hasattr(other, 'id'), "You cannot compare two objects of different type." - if self.id == other.id: - return True + if isinstance(other, self.__class__) and hasattr(other, 'id'): + if self.id == other.id: + return True return False diff --git a/tests/fields.py b/tests/fields.py index 47534116..5a1a22fc 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -413,6 +413,7 @@ class FieldTest(unittest.TestCase): bm.reload() self.assertEqual(bm.bookmark_object, post_1) + self.assertTrue(isinstance(bm.bookmark_object, Post)) bm.bookmark_object = link_1 bm.save() @@ -420,6 +421,7 @@ class FieldTest(unittest.TestCase): bm.reload() self.assertEqual(bm.bookmark_object, link_1) + self.assertTrue(isinstance(bm.bookmark_object, Link)) Link.drop_collection() Post.drop_collection()