Django MPTT:在迁移文件中重建树

时间:2018-12-27 18:40:48

标签: django django-mptt

我的项目中已经有一个模型,现在我想与django-mptt一起使用。该模型已包含一些数据。

在迁移期间,系统会要求您为django-mptt创建的某些字段设置默认值。按照文档中的指示,我将0设置为默认值之一。本文档继续进行,建议完成此操作后运行Model.objects.rebuild(),以在字段中设置正确的值。我想通过我的迁移文件执行此操作。我不想通过我的django-shell运行此程序,因为这不是一次性操作。

我的迁移文件是如此:

# -*- 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'。当然,同一命令在shell中也可以完美地工作。

我需要通过迁移来执行此操作,因为我希望此操作在每次部署项目时自动运行。

1 个答案:

答案 0 :(得分:0)

如果要重建适当的迁移,可以to use this code。如果您抓住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)