Django %(class)s не заменяется корректно при использовании в m2m отношения к себе в абстрактной модели

Документация Django советует устанавливать related_name и related_query_name, используя плейсхолдеры имен классов/приложений %(class)s и %(app_label)s.

Я обнаружил, что в абстрактной модели с полем "многие-ко-многим" к самому себе эти метки не заменяются корректно. Это происходит потому, что они не нужны в отношениях "self" "многие-ко-многим"?

class GeographicalArea(models.Model):
    successors = models.ManyToManyField(
        "self",
        symmetrical=False,
        blank=True,
        related_name="%(class)s_predecessors",
        related_query_name="%(app_label)s_%(class)s_predecessor",
        help_text="Successors of area if changed.",
    )

    class Meta:
        abstract = True

class Country(GeographicalArea):
    name = models.CharField(
        blank=False,
        unique=True,
        db_index=True,
    )

... генерирует сценарий миграции, в котором related_name='%(class)s_predecessors' и related_query_name='%(app_label)s_%(class)s_predecessor' вместо related_name='country_predecessors' и related_query_name='myapp_country_predecessor', как я ожидал.

В миграциях не отображаются окончательные имена, но это все равно будет работать.

Запустите миграции, related_name и related_query_name будут соответствовать ожиданиям:

from my_app.models import Country
Country._meta.get_field("successors").remote_field.related_query_name
>>> 'my_app_country_predecessors'
Вернуться на верх