The inheritance model has changed, we no longer need to store an array of `types` with the model we can just use the classname in `_cls`. See the upgrade docs for information on how to upgrade MongoEngine/mongoengine#148
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
import unittest
|
|
|
|
from mongoengine import Document, connect
|
|
from mongoengine.connection import get_db
|
|
from mongoengine.fields import StringField
|
|
|
|
__all__ = ('TurnOffInheritanceTest', )
|
|
|
|
|
|
class TurnOffInheritanceTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
connect(db='mongoenginetest')
|
|
self.db = get_db()
|
|
|
|
def tearDown(self):
|
|
for collection in self.db.collection_names():
|
|
if 'system.' in collection:
|
|
continue
|
|
self.db.drop_collection(collection)
|
|
|
|
def test_how_to_turn_off_inheritance(self):
|
|
"""Demonstrates migrating from allow_inheritance = True to False.
|
|
"""
|
|
|
|
# 1. Old declaration of the class
|
|
|
|
class Animal(Document):
|
|
name = StringField()
|
|
meta = {
|
|
'allow_inheritance': True,
|
|
'indexes': ['name']
|
|
}
|
|
|
|
# 2. Turn off inheritance
|
|
class Animal(Document):
|
|
name = StringField()
|
|
meta = {
|
|
'allow_inheritance': False,
|
|
'indexes': ['name']
|
|
}
|
|
|
|
# 3. Remove _types and _cls
|
|
collection = Animal._get_collection()
|
|
collection.update({}, {"$unset": {"_types": 1, "_cls": 1}}, multi=True)
|
|
|
|
# 3. Confirm extra data is removed
|
|
count = collection.find({"$or": [{'_types': {"$exists": True}},
|
|
{'_cls': {"$exists": True}}]}).count()
|
|
assert count == 0
|
|
|
|
# 4. Remove indexes
|
|
info = collection.index_information()
|
|
indexes_to_drop = [key for key, value in info.iteritems()
|
|
if '_types' in dict(value['key'])
|
|
or '_cls' in dict(value['key'])]
|
|
for index in indexes_to_drop:
|
|
collection.drop_index(index)
|
|
|
|
# 5. Recreate indexes
|
|
Animal.objects._ensure_indexes()
|