2016-11-14 4 views
0

私は単純な要求だと思っていますが、私は壁に頭を打ちました。django ManyToMany関係を動的にグループ化する方法

私はdjango 1.10を使用しています。私は何をしようとしていること

モデルは次のようになり、私の家族のフィールドでグループ化された私のメンバーのリストを取得することです:

class Family(models.Model): 
    family_name = models.CharField(max_length=200) 

class Member(models.Model): 
    name = models.OneToOneField(User) 
    family = models.ManyToManyField(Family,blank=True,related_name='members') 

は、だから私は使用するように私の見解を設定することができ

members = Member.objects.order_by('family') 

または

members = Family.objects.order_by('family_name') 

これは明らかに私のメンバーまたは私の家族だけでなく、両方を保持します。どうすればメンバー名とその家族の両方を持ち、グループ化するのですか?私が探しています出力の

アン例は次のとおりです。

ファミリー1

  • メンバー1
  • メンバー2

ファミリー2

  • メンバー1
  • メンバー3

助けていただければ幸いです。

答えて

1

最初の問題は何ですか?あなたが家族のnameでそれを注文したい場合は、操作を行います。

members = Member.objects.order_by('family__family_name') 

これらのメンバーはすべて.family経由で利用できる家族を持っています。あなたが本当に自分の部材を介して家族や、ループをしたい場合一方

members = Member.objects.order_by('family__family_name').select_related('family') 

、実行します。あなたはこれらのメンバーをループしているDBクエリを保存したいとその家族にアクセスする場合は、select_related追加することができます:

families = Family.objects.order_by('family_name').prefetch_related('members') 
for fam in families: 
    // do sth. with family 
    for mem in fam.members.all(): 
     // do sth. with member 

prefetch_relatedは、どんなに多くの家族やメンバー、唯一の2デシベルクエリでこの実行を行いません。

+0

@schwobaseggleこれの結果は、私がすでに得ているものと同じになります。私はあなたが正しいところにいると思う。私が必要としているが、それを手に入れる方法がわからない。私はそこにいかに役立つかを知るために私の質問に例を追加しました。 – jAC

+0

愚かな音を残念に申し訳ありませんが、私はテンプレート内で使用される同じ方法で入れ子になったforループから引き出すことができるメンバーを持つファミリを持つクエリセットにこれを構築する方法は? – jAC

+1

私はあなたがいるか分かりません:)テンプレートコンテクストに 'families' QSを渡して、ネストされたテンプレートループを使用することができます:' {ファミリのファミリの%%} .. {fam.membersのmemの%すべて%} ... {%endfor%} {%endfor%} ' – schwobaseggl

関連する問題