Django MPTT: перестроить дерево в файле миграции - PullRequest
0 голосов
/ 27 декабря 2018

У меня уже есть модель в моем проекте, которую я сейчас хочу использовать с django-mptt.Эта модель уже содержит некоторые данные.

Во время миграции вам предлагается установить значения по умолчанию для некоторых полей, которые создает django-mptt.Как указано в документации, я установил 0 как значение по умолчанию.Документация продолжается и рекомендует запускать Model.objects.rebuild() после этого, чтобы установить правильные значения в полях.Я хотел бы выполнить эту операцию через мои файлы миграции.Я НЕ хочу запускать это через мою django-оболочку, так как это не разовая операция.

Мои файлы миграции таковы:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2018-12-27 17:33
from __future__ import unicode_literals

from django.db import migrations, models


def migrate_mptt(apps, schema_editor):
    ProductCategory = apps.get_model("product", "ProductCategory")
    ProductCategory.objects.rebuild()


class Migration(migrations.Migration):

    dependencies = [
        ('product', '0016_auto_20181227_2303'),
    ]

    operations = [
        migrations.RunPython(migrate_mptt),
    ]

При миграции я получаю ошибку AttributeError: 'Manager' object has no attribute 'rebuild'.Конечно, эта же команда отлично работает в оболочке.

Мне нужно сделать это с помощью миграций, поскольку я хочу, чтобы эта операция запускалась автоматически при каждом развертывании моего проекта.

1 Ответ

0 голосов
/ 23 мая 2019

Если вы хотите перестроить должную миграцию, вы можете использовать этот код .Если вы поймете AttributeError с этим, попробуйте установить менеджер модели как атрибут your_name (не как objects).

Также, если вы планируете перестраивать после миграции, вы можете расширить конфигурацию своего приложения:

    from django.apps import AppConfig
    from django.db.models.signals import post_migrate

    def rebuild_tree(sender, **kwargs):
        from .models import YourModel
        YourModel.objects.rebuild()

    class YouApponfig(AppConfig):
        name = 'app_name'

        def ready(self):
            post_migrate.connect(rebuild_tree, sender=self)
...