Merge pull request #1999 from bagerard/fix_documentation_dynamicdoc_underscore_field_undeclared
Improve DynamicDocument documentation regarding fields with underscore
This commit is contained in:
commit
db47604865
@ -1016,7 +1016,7 @@ class DynamicDocument(six.with_metaclass(TopLevelDocumentMetaclass, Document)):
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
There is one caveat on Dynamic Documents: fields cannot start with `_`
|
There is one caveat on Dynamic Documents: undeclared fields cannot start with `_`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# The __metaclass__ attribute is removed by 2to3 when running with Python3
|
# The __metaclass__ attribute is removed by 2to3 when running with Python3
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from mongoengine import *
|
from mongoengine import *
|
||||||
from mongoengine.connection import get_db
|
from tests.utils import MongoDBTestCase
|
||||||
|
|
||||||
__all__ = ("DynamicTest", )
|
__all__ = ("TestDynamicDocument", )
|
||||||
|
|
||||||
|
|
||||||
class DynamicTest(unittest.TestCase):
|
class TestDynamicDocument(MongoDBTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
connect(db='mongoenginetest')
|
super(TestDynamicDocument, self).setUp()
|
||||||
self.db = get_db()
|
|
||||||
|
|
||||||
class Person(DynamicDocument):
|
class Person(DynamicDocument):
|
||||||
name = StringField()
|
name = StringField()
|
||||||
@ -98,6 +97,72 @@ class DynamicTest(unittest.TestCase):
|
|||||||
self.assertEqual(len(p._data), 4)
|
self.assertEqual(len(p._data), 4)
|
||||||
self.assertEqual(sorted(p._data.keys()), ['_cls', 'age', 'id', 'name'])
|
self.assertEqual(sorted(p._data.keys()), ['_cls', 'age', 'id', 'name'])
|
||||||
|
|
||||||
|
def test_fields_without_underscore(self):
|
||||||
|
"""Ensure we can query dynamic fields"""
|
||||||
|
Person = self.Person
|
||||||
|
|
||||||
|
p = self.Person(name='Dean')
|
||||||
|
p.save()
|
||||||
|
|
||||||
|
raw_p = Person.objects.as_pymongo().get(id=p.id)
|
||||||
|
self.assertEqual(
|
||||||
|
raw_p,
|
||||||
|
{
|
||||||
|
'_cls': u'Person',
|
||||||
|
'_id': p.id,
|
||||||
|
'name': u'Dean'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
p.name = 'OldDean'
|
||||||
|
p.newattr = 'garbage'
|
||||||
|
p.save()
|
||||||
|
raw_p = Person.objects.as_pymongo().get(id=p.id)
|
||||||
|
self.assertEqual(
|
||||||
|
raw_p,
|
||||||
|
{
|
||||||
|
'_cls': u'Person',
|
||||||
|
'_id': p.id,
|
||||||
|
'name': 'OldDean',
|
||||||
|
'newattr': u'garbage'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_fields_containing_underscore(self):
|
||||||
|
"""Ensure we can query dynamic fields"""
|
||||||
|
class WeirdPerson(DynamicDocument):
|
||||||
|
name = StringField()
|
||||||
|
_name = StringField()
|
||||||
|
|
||||||
|
WeirdPerson.drop_collection()
|
||||||
|
|
||||||
|
p = WeirdPerson(name='Dean', _name='Dean')
|
||||||
|
p.save()
|
||||||
|
|
||||||
|
raw_p = WeirdPerson.objects.as_pymongo().get(id=p.id)
|
||||||
|
self.assertEqual(
|
||||||
|
raw_p,
|
||||||
|
{
|
||||||
|
'_id': p.id,
|
||||||
|
'_name': u'Dean',
|
||||||
|
'name': u'Dean'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
p.name = 'OldDean'
|
||||||
|
p._name = 'NewDean'
|
||||||
|
p._newattr1 = 'garbage' # Unknown fields won't be added
|
||||||
|
p.save()
|
||||||
|
raw_p = WeirdPerson.objects.as_pymongo().get(id=p.id)
|
||||||
|
self.assertEqual(
|
||||||
|
raw_p,
|
||||||
|
{
|
||||||
|
'_id': p.id,
|
||||||
|
'_name': u'NewDean',
|
||||||
|
'name': u'OldDean',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def test_dynamic_document_queries(self):
|
def test_dynamic_document_queries(self):
|
||||||
"""Ensure we can query dynamic fields"""
|
"""Ensure we can query dynamic fields"""
|
||||||
p = self.Person()
|
p = self.Person()
|
||||||
@ -369,5 +434,6 @@ class DynamicTest(unittest.TestCase):
|
|||||||
person.save()
|
person.save()
|
||||||
self.assertEqual(Person.objects.first().age, 35)
|
self.assertEqual(Person.objects.first().age, 35)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user