Как исключить поле verbose_name_plural из миграции?

<
from django.utils.functional import lazy
from django.utils.translation import gettext_lazy as _

class Post(models.Model):
    # ...

    class Meta:
        verbose_name = 'Post'
        verbose_name_plural = lazy(lambda: _('Posts ({})').format(Post.....count()), str)()

<
from django.db import migrations


class Migration(migrations.Migration):
    operations = [
        migrations.AlterModelOptions(
            name='post',
            options={'verbose_name': 'Post', 'verbose_name_plural': 'Posts (123)'},
        ),
    ]

Добрый день! Я использую динамическое поле verbose_name_plural для отображения некоторой актуальной информации в админ панели. Версия Django: 4.1 Модель выглядит следующим образом:

Я нашел этот вариант: https://stackoverflow.com/a/39801321/2166371 Но я не знаю, насколько это актуально и почему класс, который не используется, импортируется там

Основываясь на варианте, который предложил 0sVoid, я реализовал немного другой вариант, который, похоже, работает без проблем.

Изначально было предложено изменить один метод в главном классе панели администратора (_build_app_dict): https://stackoverflow.com/a/71740645/2166371

Но в этом методе слишком много кода, который я не хотел переписывать

Я переписал другой метод get_app_list

Родительский метод:

    def get_app_list(self, request, app_label=None):
        """
        Return a sorted list of all the installed apps that have been
        registered in this site.
        """
        app_dict = self._build_app_dict(request, app_label)

        # Sort the apps alphabetically.
        app_list = sorted(app_dict.values(), key=lambda x: x["name"].lower())

        # Sort the models alphabetically within each app.
        for app in app_list:
            app["models"].sort(key=lambda x: x["name"])

        return app_list

Моя версия:

    def get_app_list(self, request, app_label=None):
        """
        Return a sorted list of all the installed apps that have been
        registered in this site.
        """
        app_dict = self._build_app_dict(request, app_label)

        # Sort the apps alphabetically.
        app_list = sorted(app_dict.values(), key=lambda x: x["name"].lower())

        # Sort the models alphabetically within each app.
        for app in app_list:
            app["models"].sort(key=lambda x: x["name"])

            for model in app['models']:
                if hasattr(model['model'], 'get_name_admin_panel'):
                    model['name'] = model['model'].get_name_admin_panel()

        return app_list

Я добавил 3 новые строки, перед возвратом (эти строки также могут быть добавлены перед сортировкой, если последовательность важна для вас)

Есть проверка, что если для модели описан метод get_name_admin_panel, то мы меняем ее имя на то, которое возвращает метод

В самой модели я добавил следующие строки:

    @classmethod
    def get_name_admin_panel(cls):
        return _('Posts ({})').format(Post.objects.filter(...).count())

Благодаря этому я теперь могу установить статическое значение для поля verbose_name_plural и миграция не будет повторяться много раз

Если вы не укажете @classmethod, то, к сожалению, страница панели администратора загрузится с ошибкой, но я не заметил в этом никакой проблемы.

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