ここに 指定.
Django はそれをキャッシュします。問題は、これらの「外部キー」参照をどうするかです。たとえば、Unicodeメソッドが別の外部キーにアクセスして「わかりやすい」Unicode 文字列を出力するモデルへの外部キーがある場合、クエリセットの作成方法によっては、別の機会にデータベースにヒットする可能性があります。
明確にするために例を挙げましょう。
class Player(models.Model):
pname = models.CharField(max_length=20)
team = models.ForeignKey('Team')
class Team(models.Model):
tname = models.CharField(max_length=20)
country = models.ForeignKey('Country')
def __unicode__(self):
return self.tname + u' is from ' + self.country.cname
class Country(models.Model):
cname = models.CharField(max_length=10)
これを行う場合:
player = Player.objects.get(name=u'Messi')
print player.team
データベースに 3 回アクセスします。1 回目は選手の取得、1 回目はチームの取得、もう 1 回は国名の取得です。私が間違っていなければ、次回その「print」ステートメントを作成したときに、django はデータベースに再度ヒットしません (私は間違っているかもしれませんが、そのように機能すると思います)。
すべてのプレイヤーに対してこれを行いたいと想像してみてください。プレイヤーはたくさんいます。プレイヤーごとにデータベースに 3 回アクセスすることになりますが、これはうまくいきません。クエリを少し変更すると、同じことをデータベースに 1 回だけ実行できます。これはあなたがそれを行う方法です:
players = Player.objects.all().select_related('team__country')
for player in players:
print player.team
これが、Django でクエリセットがどのように機能するかを理解するのに役立つことを願っています。ここにリンクしたドキュメントを読んでみてください。クエリの効率を測定するのに役立つ優れたツールの 1 つがdjango_toolbarです。強くお勧めします。