将迁移应用到 Django Flatpage 模型
Apply a migration to Django Flatpage model
我想使用 modeltranslation package in a Django application that uses the flatpages 应用程序。
我安装了两者,遵循模型 t运行slation 文档,并创建了一个 translation.py
文件,我将其放入 main
应用程序(所有全局内容所在的位置) ,因为我不能将它直接放在平面页面应用程序中(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
,它在 flatpages 应用程序 /usr/local/lib/python3.8/site-packages/django/contrib/flatpages/migrations/0002_auto_20211118_1558.py
中创建了一个迁移文件。它会再次出现在 Django 代码中,所以我试图将它简单地移动到 django/main/migrations/0002_flatpages_translations.py
的 main
应用程序(已经有一个不相关的 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']
有没有可能实现我想做的事情?
找到了解决方案,所以如果有人遇到同样的问题,我会post在这里。根据Django documentation,您可以在每个应用程序的基础上指定可以找到迁移模块的包。
因此,在 settings.py
中添加:
MIGRATION_MODULES = {
'flatpages': 'main.migrations.flatpages',
}
然后将迁移文件0002_flatpages_translations.py
移动到django/main/migrations/flatpages/
。对于平面应用程序,您还需要从该目录中的平面应用程序复制 0001_initial.py
迁移文件。
你很好,Django 现在在你的新目录中搜索 flatpages 应用程序的迁移。
我想使用 modeltranslation package in a Django application that uses the flatpages 应用程序。
我安装了两者,遵循模型 t运行slation 文档,并创建了一个 translation.py
文件,我将其放入 main
应用程序(所有全局内容所在的位置) ,因为我不能将它直接放在平面页面应用程序中(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
,它在 flatpages 应用程序 /usr/local/lib/python3.8/site-packages/django/contrib/flatpages/migrations/0002_auto_20211118_1558.py
中创建了一个迁移文件。它会再次出现在 Django 代码中,所以我试图将它简单地移动到 django/main/migrations/0002_flatpages_translations.py
的 main
应用程序(已经有一个不相关的 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']
有没有可能实现我想做的事情?
找到了解决方案,所以如果有人遇到同样的问题,我会post在这里。根据Django documentation,您可以在每个应用程序的基础上指定可以找到迁移模块的包。
因此,在 settings.py
中添加:
MIGRATION_MODULES = {
'flatpages': 'main.migrations.flatpages',
}
然后将迁移文件0002_flatpages_translations.py
移动到django/main/migrations/flatpages/
。对于平面应用程序,您还需要从该目录中的平面应用程序复制 0001_initial.py
迁移文件。
你很好,Django 现在在你的新目录中搜索 flatpages 应用程序的迁移。