Примените миграцию к модели 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 в вашей новой директории.

Вернуться на верх