Added 'strict' meta parameter
This commit is contained in:
parent
19dc312128
commit
cd2d9517a0
@ -72,7 +72,7 @@ class BaseDocument(object):
|
|||||||
|
|
||||||
# Check if there are undefined fields supplied, if so raise an
|
# Check if there are undefined fields supplied, if so raise an
|
||||||
# Exception.
|
# Exception.
|
||||||
if not self._dynamic:
|
if not self._dynamic and self._meta.get('strict', True):
|
||||||
for var in values.keys():
|
for var in values.keys():
|
||||||
if var not in self._fields.keys() + ['id', 'pk', '_cls', '_text_score']:
|
if var not in self._fields.keys() + ['id', 'pk', '_cls', '_text_score']:
|
||||||
msg = (
|
msg = (
|
||||||
|
@ -16,7 +16,8 @@ from tests.fixtures import (PickleEmbedded, PickleTest, PickleSignalsTest,
|
|||||||
|
|
||||||
from mongoengine import *
|
from mongoengine import *
|
||||||
from mongoengine.errors import (NotRegistered, InvalidDocumentError,
|
from mongoengine.errors import (NotRegistered, InvalidDocumentError,
|
||||||
InvalidQueryError, NotUniqueError)
|
InvalidQueryError, NotUniqueError,
|
||||||
|
FieldDoesNotExist)
|
||||||
from mongoengine.queryset import NULLIFY, Q
|
from mongoengine.queryset import NULLIFY, Q
|
||||||
from mongoengine.connection import get_db
|
from mongoengine.connection import get_db
|
||||||
from mongoengine.base import get_document
|
from mongoengine.base import get_document
|
||||||
@ -2467,6 +2468,117 @@ class InstanceTest(unittest.TestCase):
|
|||||||
group = Group.objects.first()
|
group = Group.objects.first()
|
||||||
self.assertEqual("hello - default", group.name)
|
self.assertEqual("hello - default", group.name)
|
||||||
|
|
||||||
|
def test_load_undefined_fields(self):
|
||||||
|
class User(Document):
|
||||||
|
name = StringField()
|
||||||
|
|
||||||
|
User.drop_collection()
|
||||||
|
|
||||||
|
User._get_collection().save({
|
||||||
|
'name': 'John',
|
||||||
|
'foo': 'Bar',
|
||||||
|
'data': [1, 2, 3]
|
||||||
|
})
|
||||||
|
|
||||||
|
with self.assertRaises(FieldDoesNotExist):
|
||||||
|
User.objects.first()
|
||||||
|
|
||||||
|
def test_load_undefined_fields_with_strict_false(self):
|
||||||
|
class User(Document):
|
||||||
|
name = StringField()
|
||||||
|
|
||||||
|
meta = {'strict': False}
|
||||||
|
|
||||||
|
User.drop_collection()
|
||||||
|
|
||||||
|
User._get_collection().save({
|
||||||
|
'name': 'John',
|
||||||
|
'foo': 'Bar',
|
||||||
|
'data': [1, 2, 3]
|
||||||
|
})
|
||||||
|
|
||||||
|
user = User.objects.first()
|
||||||
|
self.assertEqual(user.name, 'John')
|
||||||
|
self.assertFalse(hasattr(user, 'foo'))
|
||||||
|
self.assertEqual(user._data['foo'], 'Bar')
|
||||||
|
self.assertFalse(hasattr(user, 'data'))
|
||||||
|
self.assertEqual(user._data['data'], [1, 2, 3])
|
||||||
|
|
||||||
|
def test_load_undefined_fields_on_embedded_document(self):
|
||||||
|
class Thing(EmbeddedDocument):
|
||||||
|
name = StringField()
|
||||||
|
|
||||||
|
class User(Document):
|
||||||
|
name = StringField()
|
||||||
|
thing = EmbeddedDocumentField(Thing)
|
||||||
|
|
||||||
|
User.drop_collection()
|
||||||
|
|
||||||
|
User._get_collection().save({
|
||||||
|
'name': 'John',
|
||||||
|
'thing': {
|
||||||
|
'name': 'My thing',
|
||||||
|
'foo': 'Bar',
|
||||||
|
'data': [1, 2, 3]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
with self.assertRaises(FieldDoesNotExist):
|
||||||
|
User.objects.first()
|
||||||
|
|
||||||
|
def test_load_undefined_fields_on_embedded_document_with_strict_false_on_doc(self):
|
||||||
|
class Thing(EmbeddedDocument):
|
||||||
|
name = StringField()
|
||||||
|
|
||||||
|
class User(Document):
|
||||||
|
name = StringField()
|
||||||
|
thing = EmbeddedDocumentField(Thing)
|
||||||
|
|
||||||
|
meta = {'strict': False}
|
||||||
|
|
||||||
|
User.drop_collection()
|
||||||
|
|
||||||
|
User._get_collection().save({
|
||||||
|
'name': 'John',
|
||||||
|
'thing': {
|
||||||
|
'name': 'My thing',
|
||||||
|
'foo': 'Bar',
|
||||||
|
'data': [1, 2, 3]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
with self.assertRaises(FieldDoesNotExist):
|
||||||
|
User.objects.first()
|
||||||
|
|
||||||
|
def test_load_undefined_fields_on_embedded_document_with_strict_false(self):
|
||||||
|
class Thing(EmbeddedDocument):
|
||||||
|
name = StringField()
|
||||||
|
|
||||||
|
meta = {'strict': False}
|
||||||
|
|
||||||
|
class User(Document):
|
||||||
|
name = StringField()
|
||||||
|
thing = EmbeddedDocumentField(Thing)
|
||||||
|
|
||||||
|
User.drop_collection()
|
||||||
|
|
||||||
|
User._get_collection().save({
|
||||||
|
'name': 'John',
|
||||||
|
'thing': {
|
||||||
|
'name': 'My thing',
|
||||||
|
'foo': 'Bar',
|
||||||
|
'data': [1, 2, 3]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
user = User.objects.first()
|
||||||
|
self.assertEqual(user.name, 'John')
|
||||||
|
self.assertEqual(user.thing.name, 'My thing')
|
||||||
|
self.assertFalse(hasattr(user.thing, 'foo'))
|
||||||
|
self.assertEqual(user.thing._data['foo'], 'Bar')
|
||||||
|
self.assertFalse(hasattr(user.thing, 'data'))
|
||||||
|
self.assertEqual(user.thing._data['data'], [1, 2, 3])
|
||||||
|
|
||||||
def test_spaces_in_keys(self):
|
def test_spaces_in_keys(self):
|
||||||
|
|
||||||
class Embedded(DynamicEmbeddedDocument):
|
class Embedded(DynamicEmbeddedDocument):
|
||||||
|
@ -3160,7 +3160,7 @@ class FieldTest(unittest.TestCase):
|
|||||||
|
|
||||||
def test_undefined_field_exception(self):
|
def test_undefined_field_exception(self):
|
||||||
"""Tests if a `FieldDoesNotExist` exception is raised when trying to
|
"""Tests if a `FieldDoesNotExist` exception is raised when trying to
|
||||||
set a value to a field that's not defined.
|
instanciate a document with a field that's not defined.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class Doc(Document):
|
class Doc(Document):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user