2009-06-21 7 views
0

私はDjangoに付属の標準Userモデル(django.contrib.auth)を使用しています。私は、Djangoアプリケーションで自分のモデルのいくつかを作り、このような関係を作成しました:Django - ユーザーをサブクラス化する代わりに?

from django.db import models 
from django.contrib.auth.models import User 

class GroupMembership(models.Model): 
    user = models.ForeignKey(User, null = True, blank = True, related_name='memberships') 
    #other irrelevant fields removed from example 

だから私は今、ユーザーの現在のメンバーシップのすべてを取得するには、この操作を行うことができます。

user.memberships.all() 

しかし、

user.memberships.all().select_related('group__name') 

これは正常に動作しますが、私はテンプレートで、このデータを取得したい:、私はこのように、より複雑なクエリを実行できるようにしたいです。このようなロジックをテンプレートの中に入れようとするのはばかげているので(とにかく動作させることはできません)、より良い方法を作りたいと思っています。私はサブクラスのUserにすることができましたが、それは素晴らしい解決策のようには思えません。将来私のアプリケーションを他のDjangoのサイトに移動したいかもしれません。おそらく、Userをサブクラス化した別のアプリケーションがあればそれを働かせることができます。

GroupMembershipの中にメソッドを作成するのがベストですか、get_by_user(user)と呼ばれますか?私はテンプレートからこれを呼び出すことができますか?

私は誰でもこれを構造化することができますアドバイスをいただければ幸いです。これは少し長い/曖昧です。

+0

Userモデルには、Group Membership定義によってメソッドが追加されていますか? –

+0

私はそれがメソッドを追加したのか分からなかった。私はUser.membershipsプロパティを作成することを知っていましたが、それだけではありませんか? –

答えて

3

最初にselect_relatedを呼び出して引数を渡すと、何も行われません。キャッシュにデータを入れるべきだというヒントです。

select_relatedはテンプレート内では決して呼び出しません。表示機能のみです。そして、あなたが他の処理のためにそれらのすべての関連オブジェクトを必要としていることを知ったときだけ。

"get_by_user(user)と呼ばれるGroupMembership内にメソッドを作成するのが最善ですか?"

あなたはこれを持っています。私は何が間違っているのか分かりません。

GroupMembership.objects.filter(user="someUser") 

「これをテンプレートから呼び出せますか?」

いいえこれはビューの機能です。

groups = GroupMembership.objects.filter(user="someUser") 

次にあなたがレンダリングのためのテンプレートにgroupsオブジェクトを提供します。


編集

これは、コードの1行です。あなたのすべてのビュー機能にこれを含めるのは負担がかかりません。

あなたは、これがすべてのページに表示したい場合は、このコード行を繰り返し伴わない選択肢がたくさんある..

  1. ビュー機能は、別の関数を呼び出すことができます。

  2. 単純な関数ではなく呼び出し可能なオブジェクトを試してみることもできます。これらは、この情報を埋め込む共通の呼び出し可能オブジェクトをサブクラス化することができます。

  3. テンプレートコンテキストプロセッサを追加して、レンダリングされるすべてのテンプレートのコンテキストに配置することができます。

  4. これは、デコレータを持つすべてのビュー機能で確実に行うための独自のデコレータを作成することができます。

+0

ありがとうございました。私はいくつかの状況下ではテンプレートでモデルを使用するのは良いという印象を受けました。この場合、さまざまなビューのページの一部としてテンプレートを使用したいと思いますが、データをフェッチしてテンプレートに割り当てるコードをコピーして貼り付ける必要はありません。 –

+2

あなたのためにフィルタリングを行うテンプレートタグを書くことができます。ベーステンプレートで一度使用してください。必要なC&Pはありません。ロジックは、ビュー機能と同じです。 http://docs.djangoproject.com/ja/dev/howto/custom-template-tags/#howto-custom-template-tags – vikingosegundo

関連する問題