1

私は持っていmodels.pyます:

class Team(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()

    a = models.IntegerField()
    b = models.IntegerField()

    def get_stat(self):
        return {
            'xy': self.x + self.y,
            'ab': self.a + self.b
        }

    stat = property(get_stat)

team.htmlが持っている:

xy stat: {{ team.stat.xy }}
ab stat: {{ team.stat.ab }}

問題は、「djangoは、get_stat呼び出すたびに関数を実行するのstatか、それとも結果をキャッシュするのか」ということです。

4

2 に答える 2

2

いいえ、property結果はキャッシュされません。

頻繁に繰り返しアクセスするためにキャッシュする場合、一般的なデザインパターンは次のとおりです。

def get_stat(self):
    if not hasattr(self, '__get_stat'):
         self.__get_stat =  {
            'xy': self.x + self.y,
            'ab': self.a + self.b
         }
    return self.__get_stat

もちろん、これは、その場で変更されているがDBにコミットされていないインスタンスを処理するような奇妙なことをしている場合は機能しません。私は99%の使用がDB->オブジェクト->アクションに関係していると信じています

于 2013-01-16T04:05:10.470 に答える
1

キャッシュされていないことをすでに知っているので、これは特定の答えではありませんが、いくつかの一般的なアドバイスです。通常、このようなものがキャッシュされているかどうか(またはランダムなコードが呼び出されているかどうか)を判断する方法は、そこにロギングまたはデバッグステートメントを追加することです。

def get_stat(self):
    # logging or debugging statement here, e.g. import ipdb; ipdb.set_trace()
    # for ipdb, you need to pip install ipdb
    return {
        'xy': self.x + self.y,
        'ab': self.a + self.b
    }

これをdjangoの独自のコードで使用して、ページが提供されているときに実行されるパスを確認することもできます。

于 2013-01-16T09:08:57.923 に答える