web-dev-qa-db-ja.com

Djangoの 'related_name'属性と 'related_query_name'属性の違いは?

Fieldオブジェクトのrelated_name属性とrelated_query_name属性の違いについて、Django?を使用する場合の使用方法、ありがとうございます!

19
Hùng Ng Vi

related_nameは、関連オブジェクトの属性であり、外部キーを含むモデルに「後方」に移動できます。たとえば、ModelAmodel_b = ForeignKeyField(ModelB, related_name='model_as')のようなフィールドがある場合、これにより、ModelAインスタンスに関連するModelBインスタンスにアクセスできます。 model_b_instance.model_as.all()になります。外部キーは1対多の関係であり、その方程式の多くの側面は外部キーフィールドが宣言されているモデルであるため、これは一般に外部キーに対して複数で記述されることに注意してください。

ドキュメントにリンクされている詳細な説明が役立ちます。 https://docs.djangoproject.com/en/1.10/topics/db/queries/#backwards-related-objects

related_query_nameは、Django querysetsで使用します。外部キー関連フィールドの逆リレーションシップでフィルタリングできます。例を続けるために、Model Aのようなフィールドを持つ:model_b = ForeignKeyField(ModelB, related_query_name='model_a')を使用すると、model_aをクエリセットのルックアップパラメーターとして使用できます。例:ModelB.objects.filter(model_a=whatever)related_query_nameに単数形を使用するのがより一般的です。 related_namerelated_query_nameの両方(またはいずれか)を指定しますDjangoには適切なデフォルトがあります。

37
ChidG
_class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)

class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
_

ここで、外部キーの前方関係はアルバムからミュージシャンへ、後方関係はミュージシャンからアルバムへです。つまり、1つのアルバムインスタンスは1つのミュージシャンインスタンスのみと関係を持つことができ(前方関係)、1つのミュージシャンインスタンスは複数のアルバムインスタンスと関係することができます(後方)。 forwardクエリはこのAlbum_instance.artistのようになります。ここでは、album_instancに続けてartist(フィールド名)によって実行されるforwardクエリに注意してください。そして後方になります

_Musician_instance.album_set.all() 
_

ここでは、逆方向クエリの場合、modelname_setが使用されます。

artist = models.ForeignKey(Musician, on_delete=models.CASCADE, related_name='back')のようなrelated_nameを指定した場合

逆方向のクエリ構文は変更され、modelname_set(artist.set)はbackに置き換えられます。今後方クエリ

_Musician_instance.back.all()
_

Django後方関係を作成しない場合は、related_nameを「+」に設定するか、「+」で終了します。

およびrelated_query_nameは、ターゲットモデルからの逆フィルター名に使用します

1
biswa1991