Merge pull request #1999 from bagerard/fix_documentation_dynamicdoc_underscore_field_undeclared

Improve DynamicDocument documentation regarding fields with underscore
This commit is contained in:
erdenezul 2019-02-18 09:33:39 +08:00 committed by GitHub
commit db47604865
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 72 additions and 6 deletions

View File

@ -1016,7 +1016,7 @@ class DynamicDocument(six.with_metaclass(TopLevelDocumentMetaclass, Document)):
.. 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

View File

@ -1,16 +1,15 @@
import unittest
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):
connect(db='mongoenginetest')
self.db = get_db()
super(TestDynamicDocument, self).setUp()
class Person(DynamicDocument):
name = StringField()
@ -98,6 +97,72 @@ class DynamicTest(unittest.TestCase):
self.assertEqual(len(p._data), 4)
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):
"""Ensure we can query dynamic fields"""
p = self.Person()
@ -369,5 +434,6 @@ class DynamicTest(unittest.TestCase):
person.save()
self.assertEqual(Person.objects.first().age, 35)
if __name__ == '__main__':
unittest.main()