2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Django modelsの抽象クラスを使ったrelated_nameの重複防止

Last updated at Posted at 2019-09-19

タイトルの通り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|

このようになるので、いちいちクラスごとに名前を手入力する必要がなくなります。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?