2

私のデータベースには、次のように説明するいくつかの関係があります。

@property
def translations(self):
    """
    :return: QuerySet
    """
    if not hasattr(self, '_translations'):
        self._translations = ClientTranslation.objects.filter(base=self)
    return self._translations

hasattr()との背後にある考え方self._translationは、dbを1回だけヒットさせ、2回目は保存されたプロパティが返されるようにすることです。

ただし、ドキュメントを読んだ後、コードがそれを行っているかどうかはわかりません-クエリは値が本当に必要なときにのみデータベースにヒットするため-これは私のコードの後に​​あります。

正しいアプローチはどのように見えますか?

4

1 に答える 1

3

はい、誰かが最初に値を必要としたときにDBがヒットします。ただし、ご指摘のとおり、結果ではなくクエリを保存します。でクエリをラップしてlist(...)、結果を保存します。

ちなみに、cached_propertyデコレータを使用して、よりエレガントにすることができます。ただし、これは組み込みではありません。ここで見つけることができます。最終的には:

@cached_property
def translations(self):
    return list(ClientTranslation.objects.filter(base=self))
于 2013-03-16T09:13:05.503 に答える