[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で参照先のモデルを指定します。

何も指定しない場合は、自動的に逆参照の名前は参照先のモデル名_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'