将迁移应用到 Django Flatpage 模型

Posted

技术标签:

【中文标题】将迁移应用到 Django Flatpage 模型【英文标题】:Apply a migration to Django Flatpage model 【发布时间】:2021-12-29 13:25:04 【问题描述】:

我想在使用 flatpages 应用程序的 Django 应用程序中使用 modeltranslation 包。

我安装了两者,遵循模型翻译文档,并创建了一个 translation.py 文件,我把它放在 main 应用程序中(所有全局内容都在其中),因为我不能直接把它放在公寓里pages 应用程序(Django 代码是必需的,未提交给 VCS)。

# django/main/translation.py
from modeltranslation.translator import translator, TranslationOptions
from django.contrib.flatpages.models import FlatPage


class FlatPageTranslationOptions(TranslationOptions):
    fields = ('title', 'content')


translator.register(FlatPage, FlatPageTranslationOptions)

然后我运行python manage.py makemigrations,它在平面应用程序/usr/local/lib/python3.8/site-packages/django/contrib/flatpages/migrations/0002_auto_20211118_1558.py 中创建了一个迁移文件。它将再次出现在 Django 代码中,因此我尝试将其简单地移动到位于django/main/migrations/0002_flatpages_translations.pymain 应用程序(已经有一个不相关的0001_initial.py 迁移,它没有依赖关系):

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('flatpages', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='flatpage',
            name='content_en',
            field=models.TextField(blank=True, null=True, verbose_name='content'),
        ),
        migrations.AddField(
            model_name='flatpage',
            name='content_fr',
            field=models.TextField(blank=True, null=True, verbose_name='content'),
        ),
        migrations.AddField(
            model_name='flatpage',
            name='title_en',
            field=models.CharField(max_length=200, null=True, verbose_name='title'),
        ),
        migrations.AddField(
            model_name='flatpage',
            name='title_fr',
            field=models.CharField(max_length=200, null=True, verbose_name='title'),
        ),
    ]

而且...当我最终尝试运行迁移 (python manage.py migrate) 时,我收到了这个错误:

CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0001_initial, 0002_flatpages_translations in main).
To fix them run 'python manage.py makemigrations --merge'

我尝试了--merge 标志,但又遇到了另一个错误:ValueError: Could not find common ancestor of ['0001_initial', '0002_flatpages_translations'] 有没有可能实现我想做的事情?

【问题讨论】:

【参考方案1】:

找到了解决方案,所以如果有人遇到同样的问题,我会在此处发布。根据Django documentation,您可以指定可以在每个应用程序基础上找到迁移模块的包。

所以,在settings.py 中,添加:

MIGRATION_MODULES = 
    'flatpages': 'main.migrations.flatpages',

然后将迁移文件0002_flatpages_translations.py移动到django/main/migrations/flatpages/中。对于 flatpages 应用,您还需要从该目录中的 flatpage 应用复制 0001_initial.py 迁移文件。

你很好,Django 现在在你的新目录中搜索平面页面应用程序的迁移。

【讨论】:

以上是关于将迁移应用到 Django Flatpage 模型的主要内容,如果未能解决你的问题,请参考以下文章

如何将模型从一个 django 应用程序迁移到一个新应用程序中?

如何将自定义用户模型迁移到 Django 中的不同应用程序?

如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?

如何使用 Python 迁移将 Heroku Django 应用程序的新模型表添加到远程 Heroku Postgres?

Heroku 不会在 Django 上迁移模型

将旧 (Django 0.97) 模型数据导入/迁移到 Django 1.8 或更高版本