タイトルの通りmodelsの抽象クラスを使ったrelated_nameやrelated_query_nameの重複を防ぐ方法を簡単に説明します。
%(class)s
フィールドが使用されている子クラス名を小文字に置き換えた文字列になります。
%(app_label)s
子クラスが含まれているアプリ名を小文字に置き換えた文字列になります。
説明
各アプリ名や各アプリ内のモデルクラス名は一意である必要があります。
そのため、上記を組み合わせると必然的に一意の文字列になります。
それを踏まえて下記のプログラムを見てみましょう。
common/models.py
from django.db import models
class Base(models.Model):
m2m = models.ManyToManyField(
OtherModel,
related_name="%(app_label)s_%(class)s_related",
related_query_name="%(app_label)s_%(class)s_related_query",
)
class Meta:
abstract = True
class ChildA(Base):
pass
class ChildB(Base):
pass
rare/models.py
from common.models import Base
class ChildB(Base):
pass
|Field | related_name |
|:-----------------:|:------------------:||
| common.ChildA.m2m |common_childa_related|
| common.ChildB.m2m |common_childb_related|
| rare.ChildB.m2m |rare_childb_related|
このようになるので、いちいちクラスごとに名前を手入力する必要がなくなります。