Примените миграцию к модели Django Flatpage
Я хочу использовать пакет modeltranslation в приложении Django, которое использует flatpages app.
Я установил оба приложения, следовал документации по переводу моделей и создал файл 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, поэтому я попытался просто переместить его в приложение main
по адресу django/main/migrations/0002_flatpages_translations.py
(там уже есть несвязанная миграция 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']
Возможно ли добиться того, что я хочу сделать?
Нашел решение, поэтому публикую его здесь, если у кого-то возникнет такая же проблема. Согласно документации по Django, вы можете указать пакет, в котором могут быть найдены модули миграции на основе каждого приложения.
Итак, в settings.py
добавьте:
MIGRATION_MODULES = {
'flatpages': 'main.migrations.flatpages',
}
Затем переместите файл миграции 0002_flatpages_translations.py
в каталог django/main/migrations/flatpages/
. В случае приложения flatpages, вам также нужно будет скопировать файл миграции 0001_initial.py
из приложения flatpage в эту директорию.
И вы в порядке, Django теперь ищет миграции для приложения flatpages в вашей новой директории.