0

===モデル===

class A(models.Model):
     name= models.CharField(max_length=20, blank=False)

Class B(models.Model):
     university = models.CharField(max_length=25, blank=False)
     location = models.CharField(max_length=30, blank=False)
     b_fk= models.ForeignKey(A)

Class C(models.Model):
     studentclass = models.CharField(max_length=10, blank=False)
     section = models.CharField(max_length= 10)
     c_fk = models.ForeignKey(B)

class Cfurther(models.Model):
     branch= Models.CharField(max_length=15, blank=Flase)
     number = models.IntegerField()
     cfur_fk = models.ForeignKey(C)

class Info(models.Model):
     info_number = models.IntegerField()
     info = models.CharField(max_length= 12, blank=Flase)
     info_fk = models.ForeignKey(B, related_name= "info_set")

class Infocategory(models.Model):
     find = models.CharField(max_length=15, blank=False)
     cat_fk = models.ForeignKey(Info)

class Extra(models.Model):
     extrainfo = models.CharField(max_length=30)
     extra_fk = models.ForeignKey(Infocategory)

===見る===

Django ドキュメント

外部キー関係を自動的に「たどる」QuerySet を返し、クエリの実行時に追加の関連オブジェクト データを選択します。

select_related は、単一値の関係 (外部キーおよび 1 対 1) に限定されます。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

モデルフィールドを取得するために次のクエリセットを作成しました(すべての関係は1対多です)

myquery = Info.objects.select_related().filter(info_number__iexact = 123)
  • Info Modelから上位モデル、下位モデルへとトラバースしたい
  • テンプレートで select_related() を使用してクラス Aレコードを取得するのに問題はありませんが、私の場合 (クラス B、C、Cfurther、Infocategory、Extra) で select_related を使用してすべてのモデル フィールドを取得することは可能ですか?
  • そうでない場合は、新しいクエリセットを作成する必要がありますか? またはどのselect_related()が機能しますか?

select_relatedフィールドのルックアップに関して少し混乱しています

4

1 に答える 1

4

標準のDjangoAPIを使用するだけで、すべての関係を必要なだけ深くトラバースできます。select_related関係の設定に特別なことは何もしません。(アクセス時に各外部キーを検索する代わりに)事前に結合を実行することにより、DBクエリの数を減らすことができるだけです。

ただし、ドキュメントに記載されているように、select_related外部キーとOneToOneFieldsでのみ機能します。ManyToManyFieldsではまったく機能しません。select_relatedさらに、 OneToOneFieldの場合にのみ、逆の関係に従うことができます。リバースForeignKeysはサポートされていません。最後に、デフォルトでは、。select_relatedを持つフィールドのみが続きますnull=False。NULL可能なフィールドの場合は、select_relatedそれに従うように明示的に指示する必要があります。

SomeModel.objects.select_related('some_nullable_field')

Django 1.4がヒットすると、ManyToManyFieldsとprefetch_related同様に機能し、ForeignKey関係を逆にするという新しいメソッドにアクセスできるようになります。select_related

于 2011-12-07T15:00:59.553 に答える