четверг, 19 января 2012 г.

django-mptt и South

В доке на django-mptt рекомендуют сделать manage.py syncdb при подключении MPTT. При использовании South мы сделаем две миграции: schemamigration после того, как унаследуем модель от MPTTModel и datamigration после неё, чтобы перестроить дерево. К сожалению, с последним пунктом маленькая проблема.



Для перестройки дерева вызывается метод менеджера TreeManager rebuild(). Однако внутри миграции модель "заморожена", и менеджера такого у неё нет. Решение прямое - добавить к модели менеджера и вызвать rebuild()




from mptt.managers import TreeManager
from mptt.models import MPTTOptions
...
def forwards(self, orm):
"Write your forwards methods here."
Place = orm['places.Place']
Place.add_to_class('tree', TreeManager())
Place.add_to_class('_mptt_meta', MPTTOptions())
Place.tree.init_from_model(Place)
Place.tree.rebuild()


Так сработает. Place тут - модель, дерево для которой надо перестроить.