[Django] related_nameとは何者か
Djangoでモデルを定義するときに、外部キー(ForeignKey
)にrelated_name
を指定することができますが、これは一体何を指しているのでしょう?
環境
Django2.1.4
ForeignKey
まあ、説明しなくても外部キーです。
だいたいこんな感じで使うと思います。
class User(models.Model):
name = models.CharField(max_length=128)
gender = models.ForeignKey(to='Gender', on_delete=models.PROTECT)
class Gender(models.Model):
name = models.CharField(max_length=30)
to
で参照先のモデルを指定します。
related_name
何も指定しない場合は、自動的に逆参照の名前は参照先のモデル名_set
となります。
その際にモデル名は小文字へ変換されます。
先ほど挙げたコードを例にすると以下のようにアククセスできるようになっています。
gender = Gender.objects.get(name="male")
gender.user_set # <- 外部キーにmaleが設定されている全てのUserのデータセット
related_name
を指定することでこの逆参照の名前を変更できます。
例えばこんな感じです。
class User(models.Model):
name = models.CharField(max_length=128)
gender = models.ForeignKey(to='Gender', related_name='users', on_delete=models.PROTECT)
class Gender(models.Model):
name = models.CharField(max_length=30)
この場合は、以下のようにアクセスできるようになります。
gender = Gender.objects.get(name="male")
gender.users
逆参照を無効にする
状況によっては、逆参照を無効にしておきたい場合もあります。
そんな場合は、related_naem
に'+'
を指定すると逆参照を無効にできます。
class User(models.Model):
name = models.CharField(max_length=128)
gender = models.ForeignKey(to='Gender', related_name='+', on_delete=models.PROTECT)
class Gender(models.Model):
name = models.CharField(max_length=30)
逆参照を無効にしておくと以下の様にアクセスできません。
gender = Gender.objects.get(name="male")
gender.user_set # <- エラー
AttributeError: 'Gender' object has no attribute 'user_set'