53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
import unittest
|
|
|
|
from mongoengine import Document, connect
|
|
from mongoengine.connection import get_db
|
|
from mongoengine.fields import StringField, ReferenceField, ListField
|
|
|
|
__all__ = ('ConvertToObjectIdsModel', )
|
|
|
|
|
|
class ConvertToObjectIdsModel(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
connect(db='mongoenginetest')
|
|
self.db = get_db()
|
|
|
|
def test_how_to_convert_to_object_id_reference_fields(self):
|
|
"""Demonstrates migrating from 0.7 to 0.8
|
|
"""
|
|
|
|
# 1. Old definition - using dbrefs
|
|
class Person(Document):
|
|
name = StringField()
|
|
parent = ReferenceField('self', dbref=True)
|
|
friends = ListField(ReferenceField('self', dbref=True))
|
|
|
|
Person.drop_collection()
|
|
|
|
p1 = Person(name="Wilson", parent=None).save()
|
|
f1 = Person(name="John", parent=None).save()
|
|
f2 = Person(name="Paul", parent=None).save()
|
|
f3 = Person(name="George", parent=None).save()
|
|
f4 = Person(name="Ringo", parent=None).save()
|
|
Person(name="Wilson Jr", parent=p1, friends=[f1, f2, f3, f4]).save()
|
|
|
|
# 2. Start the migration by changing the schema
|
|
# Change ReferenceField as now dbref defaults to False
|
|
class Person(Document):
|
|
name = StringField()
|
|
parent = ReferenceField('self')
|
|
friends = ListField(ReferenceField('self'))
|
|
|
|
# 3. Loop all the objects and mark parent as changed
|
|
for p in Person.objects:
|
|
p._mark_as_changed('parent')
|
|
p._mark_as_changed('friends')
|
|
p.save()
|
|
|
|
# 4. Confirmation of the fix!
|
|
wilson = Person.objects(name="Wilson Jr").as_pymongo()[0]
|
|
self.assertEqual(p1.id, wilson['parent'])
|
|
self.assertEqual([f1.id, f2.id, f3.id, f4.id], wilson['friends'])
|