1

pagetypes.py後で再利用するために、データベースからいくつかの定数(ここでは実際には単語定数を使用するべきではありません)を抽出するモジュールがあります。

def _get_page_type_(type):
    return PageType.objects.get(type=type)

PAGE_TYPE_MAIN = _get_page_type_('Main')
PAGE_TYPE_OTHER = _get_page_type_('Other')

次に、ビューのどこかで:

import pagetypes
...
print pagetypes.PAGE_TYPE_MAIN #simplified

このコードがテスト中でない限り、dbにこれらのレコードがある場合はすべて正常に機能し、確実に機能します。その場合、フィクスチャを介してそれらのレコードをdbにロードしたいと思います。それに関する問題は、syncdbpagetypesモジュールがインポートされるまでにフィクスチャがロードされない(実行されない場合でも)ため、_get_page_type_呼び出しが次のように失敗することです。

psycopg2.ProgrammingError: relation "pagetype" does not exist

テスト対象のビューによってインポートされるため、テストランナーは常にpagetypesモジュールをインポートしようとします。

この問題を回避するにはどうすればよいですか?

ページタイプ定数を遅延ロードするPAGE_TYPE_MAINことPAGE_TYPE_OTHERを考えていましたが、それらのレコードがデータベース(またはテスト中の場合はフィクスチャ)にない場合は早期に失敗させたいので、これを実装する方法がわかりません。

オブジェクトレベルのキャッシングについても考えていて、PageType.objects.get(type=type)定数が使用/呼び出されるたびに呼び出すだけですが、それはやり過ぎではないでしょうか。キャッシュなしでormを呼び出すと、db呼び出しが多すぎて、防止したいと思います。

とてもシンプルなものに違いありませんが、うまくいきません。;-)

4

1 に答える 1

2

定数の代わりに関数を使用しますが、メモ化してください。

_cache = {}

def get_page_type(type_name):
    if type_name not in _cache:
        _cache[type_name] = PageType.objects.get(type=type_name)
    return _cache[type_name]

したがってget_page_type('Main')、必要に応じて直接電話をかけるようになりました。

于 2010-06-25T17:37:48.067 に答える