2011-11-10 29 views
0

Djangoアプリケーションでは、いくつかのビューに同様のdbクエリが含まれている場合があります。 たとえば、is_active = Trueおよびis_online = Trueのすべてのエンティティのクエリ。 リファクタリング中に、このような重複呼び出しを関数に移動する必要があります。このフィルタ/クエリ関数を配置しなければならない場所が問題です。カスタムクエリ関数はどこに配置する必要がありますか?

1)クラス/エンティティの定義に?しかし、それ自体のフィルタメソッドについて「知って」いることに反対する必要がありますか? これは典型的な解決策だと思われますが、選択がオブジェクトの外部のフィーチャであると感じるので、良いデザインではないかもしれません。一方、オブジェクト内のそのようなメソッドは副作用を生成せず、かなり安全と思われます。 2)filter.Users、filter.Entitiesのようなフィルタリングを扱うモジュール/名前空間には? または他の場所ですか?

ベストプラクティスは何ですか?

答えて

3

これはまさにmodel Managersの対象です。

class MyActiveManager(models.Manager): 
    def active(self): 
     return self.filter(is_active=True) 

    def online(self): 
     return self.filter(is_online=True) 


class MyModel: 
    ... 
    objects = MyActiveManager() 

... 

active_objects = MyModel.objects.active() 
online_objects = MyModel.objects.online() 
関連する問題