1

ユーザーとの多対多の「お気に入り」関係を持つドキュメントモデルがあります。検索ページにドキュメントのリストを表示するときに、各ドキュメントが現在のユーザーのお気に入りであるかどうかを表示したいと思います。私はこれを行う 2 つの方法を知っています。1 つはより効率的で、もう 1 つはよりクリーンです。効率的でクリーンになるように別の方法があるかどうか疑問に思っています。

  1. クリーンバージョン。モデル「is_favored(user)」に、ドキュメントが特定のユーザーに好まれているかどうかを示すメソッドを用意するだけです。次に、この関数を使用して空の星または塗りつぶされた星を表示する単純なテンプレート タグを作成します。もちろん、これはドキュメントごとに異なる DB 呼び出しを行うため、効率的ではありません。しかし、ビューをまったく変更する必要がないので、これは素晴らしいことです。

  2. 効率的なバージョン。ビューで単一のデータベース クエリを実行して、お気に入りのクエリを取得し、各ドキュメントに「お気に入り」フィールドを追加します。ドキュメントを表示するすべてのビューにカスタム コードを追加する必要があり、あまり DRY ではないため、このアプローチは好きではありません。

DRYで効率的なより良いアプローチはありますか? ありがとう。

4

1 に答える 1

1

コンテキスト プロセッサは、探しているものです。

ここでそれについて読むことができます: http://www.djangobook.com/en/2.0/chapter09.html ( RequestContext と Context Processorsセクションをチェックしてください)


編集:

検索結果に現在表示されているドキュメントのリストとユーザーを取得する関数を簡単に作成することもできます。このようなもの:

def favs(user, docs):
    l = user.favorites.filter(pk__in=docs).values_list('pk', flat=True)
    return dict( (k, (k in l)) for k in docs )

これで、指定された ID のドキュメントがお気に入りかどうかを示す辞書ができました。そして、各ビューでその関数を呼び出し、その結果を使用します。

現在は DRY です (属性「お気に入り」の名前を変更したい場合は、変更を 1 つだけ行う必要があります。

于 2013-07-20T15:29:18.140 に答える