2017-02-25 5 views
1

モデルロジックに属していないDjangoで、モデル関連の繰り返しコードを管理する適切な方法を探しています。Djang®にモデル関連の反復コードをどこに格納しますか?

ことに留意してください:

  1. 「コメント」は、他のプロジェクトで使用することができ、再利用可能なアプリ、
  2. 「コメント」の例、それは問題

の単なる実例だです例:

class Comments(models.model): 
    ### model stuff ### 

Threadeコメントのレンダリングは高価な操作なので、HTMLとしてキャッシュに保存したいと考えています。

我々が対処しなければならない反復コード:

def get_comments_html(target_object): 
    ## check cache 
    ## is there is no cached copy, then build HTML and store to the cache 

私がコメントモデルのキャッシュロジックはコメント自体に関連していないと、他のどこに置かれるべきだと思います。

class ModelConsumer(object): 
    # here we can place repetitive code for all models (of just pass) 

class CommentsConsumer(ModelConsumer): 
    model = Comments 

    def get_comments_html(self, target_object): 
     # check for cahce 
     comments = self.model.object.filter(target=target_object) 
     # render HTML and store to cache 
:ALLような機能モデル消費者のクラスに

  1. ストア:ここ

    が、私はこの問題を解決するために見る3つのアプローチです:

    つの方法は、問題を解決するために

  2. このような論理をプレーン関数in comment_app/utils.py

  3. 問題ごとに独立したクラスを作成します(f.e. CommentCacheManagerなど)

モデルロジックに属していないモデル関連のコードを処理する最適なソリューションは何ですか?

この質問は、今後の製品制限につながることのないアーキテクチャ上の概念を見つけることに専念しています。

+0

私はそれを理解し、目標はそれがレンダリングだから、HTMLをキャッシュすることです高いです。 Djangoのテンプレートキャッシュを使用しない理由はありますか?キャッシングロジックを複雑にしてテンプレートキャッシングを実現していますか? https://docs.djangoproject.com/en/1.10/topics/cache/#template-fragment-caching – Max

+0

@Max、no。あなたは私を誤解しました。コメントは問題の図解に過ぎません。問題は、そのようなさまざまな問題のすべてを処理する最善の方法を見つけることにあります。モデルロジックに属さないモデル関連のコードがあるとき。 –

答えて

0

繰り返しコードがHTMLフラグメントのキャッシュ用である場合は、Django's template cachingに行ってください。

ただし、キャッシングロジックが簡単ではない場合は、問題が発生する可能性があります。 get_comments_htmlは常にコメントのQuerySetで動作するようです。代わりに、管理者にこのコードを配置する、あなたは、このようなキャッシュ・ロジックを使用することを可能にするモデルにcustom QuerySetを追加することができます。

comments_html = Comment.objects.filter(target=target_object).get_comments_html() 
+0

キャッシュをQuerySetに入れるのは良い考えだと思いますか? 「コメント」は再利用可能なアプリで、他のプロジェクトでも使用できます。 –

関連する問題