51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import unittest
|
|
import decimal
|
|
from decimal import Decimal
|
|
|
|
from mongoengine import Document, connect
|
|
from mongoengine.connection import get_db
|
|
from mongoengine.fields import StringField, DecimalField, ListField
|
|
|
|
__all__ = ('ConvertDecimalField', )
|
|
|
|
|
|
class ConvertDecimalField(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
connect(db='mongoenginetest')
|
|
self.db = get_db()
|
|
|
|
def test_how_to_convert_decimal_fields(self):
|
|
"""Demonstrates migrating from 0.7 to 0.8
|
|
"""
|
|
|
|
# 1. Old definition - using dbrefs
|
|
class Person(Document):
|
|
name = StringField()
|
|
money = DecimalField(force_string=True)
|
|
monies = ListField(DecimalField(force_string=True))
|
|
|
|
Person.drop_collection()
|
|
Person(name="Wilson Jr", money=Decimal("2.50"),
|
|
monies=[Decimal("2.10"), Decimal("5.00")]).save()
|
|
|
|
# 2. Start the migration by changing the schema
|
|
# Change DecimalField - add precision and rounding settings
|
|
class Person(Document):
|
|
name = StringField()
|
|
money = DecimalField(precision=2, rounding=decimal.ROUND_HALF_UP)
|
|
monies = ListField(DecimalField(precision=2,
|
|
rounding=decimal.ROUND_HALF_UP))
|
|
|
|
# 3. Loop all the objects and mark parent as changed
|
|
for p in Person.objects:
|
|
p._mark_as_changed('money')
|
|
p._mark_as_changed('monies')
|
|
p.save()
|
|
|
|
# 4. Confirmation of the fix!
|
|
wilson = Person.objects(name="Wilson Jr").as_pymongo()[0]
|
|
self.assertTrue(isinstance(wilson['money'], float))
|
|
self.assertTrue(all([isinstance(m, float) for m in wilson['monies']]))
|