1

例:

クラスプレーヤー(models.Model):
    チーム = models.ForeignKey(チーム)

効率の観点から、プレーヤーの「チーム」に複数回アクセスする場合、チームを一時変数に格納する方が効率的ですか?

これは効率が悪いですか:

プレーヤー = Player.objects.get(id=1)
print "プレイヤーは " のメンバーです + str(player.team)
player.team.printRoster()

これより?:

プレーヤー = Player.objects.get(id=1)
temp = player.team
print "プレイヤーは " + str(temp.team) のメンバーです
temp.printRoster()

答えはノーだと思います。どちらも同じです。しかし、同僚からさまざまなフィードバックを聞いており、客観的な視点を得たいと考えていました。

4

2 に答える 2

5

ここに 指定.

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です。強くお勧めします。

于 2012-05-30T03:16:46.573 に答える
1

Django がキャッシュします。コードを確認してください。

チェックすることでこれを確認できます

>>> player.team is player.team
于 2012-05-30T02:40:41.490 に答える