2012-03-26 5 views
0

のQueryDictからキーとして関連オブジェクトと辞書を取得するには、我々は次のモデルを考えてみましょう:(簡体字)ジャンゴ:どのように

class Collection(models.Model): 
    slug = models.SlugField() 

class Brochure(models.Model): 
    collection = models.ForeignKey(Collection) 

class Page(models.Model): 
    brochures = models.ManyToMany(Brochure) 
  • 2集「X」と「Y」があります。 。
  • ページにはパンフレットが含まれています。

    page_instance.brochures.all() 
    

    EDIT

    I:唯一の多対多のマネージャを使用して

    {'x': [brochure1, brochure2], 'y': [brochure3, brochure4]} 
    

このようなパンフレットの辞書を取得する方法はありますページに関連するパンフレットで作業したいBrochures.objects.all()またはcollection_instance.brochure_setではありません。それが私がページを含む理由です。

私は私がこれを行うことができますされ、defaultdictが見つかりました:

collection_brochures = defaultdict(list) 
for b in self.brochures.all(): 
    collection_brochures[b.collection.slug].append(b) 

実はこれは私の質問への答えです。

私はこれで動作することができますが、理想的には、このようなdictsとリストのようになります。私はこのコードスニペットは、仕事をすることを願っています

[{'collection': 'x', 'brochures': [brochure1, brochure2]}, {'collection': 'y', 'brochures': [brochure3, brochure4]}] 
+1

ご質問を詳しくお試しください。あなたがキーをCollectionインスタンスとし、その値がそのコレクションのBrochureインスタンスのリストである辞書が必要なようです。あれは正しいですか?なぜ私はページがそれに関連しているのか分かりません。 –

答えて

0

。あなたの代わりに自分のナメクジのCollectionインスタンスを参照したい場合、あなたはこの1と第三行を置き換えることができよう

collection_brochures = defaultdict(list) 
for b in self.brochures.all(): 
    collection_brochures[b.collection.slug].append(b) 
result = [] 
for collection, brochures in collection_brochures.iteritems(): 
    result.append({'collection': collection, 'brochures': brochures}) 

また、あなたは、キーとしてモデルインスタンスを使用することができます。

collection_brochures[b.collection].append(b) 

これはあなたに以下を提供しますデータ:

[{'collection': collection_x, 'brochures': [brochure1, brochure2]}, 
{'collection': collection_y, 'brochures': [brochure3, brochure4]}] 
関連する問題