2017-11-03 10 views
0

私は与えられた関係のオブジェクトの結果セットを取得します。別のパラメータで再グループ化したいと思います。これを行う簡単な方法はありますか? I FEDjangoの変数でピボットクエリを設定

構造:

class Domain(models.Model): 
    name = models.CharField(max_length=250) 

class MetaObject(models.Model): 
    name = models.CharField(max_length=250) 
    object_type = models.ForeignKey('Type') 
    domain = models.ForeignKey('Domain', models.DO_NOTHING, blank=True, null=True) 

class Type(models.Model): 
    name = models.CharField(max_length=250) 

擬似コードサンプル:

for dom in Domain.objects.all(): 
    for mo in dom.metaobject_set.all(): 
     print mo + ' ' + mo.object_type 

私が希望するので、代わりに

Domain 1 
    object 1, type 1 
    object 2, type 1 
    object 3, type 2 

を得ることの私のデータをピボットすることである私が代わりたいです結果セット私は次のようなテンプレートで作業できます

Domain 1 
    Type 1 
    object 1 
    object 2 
    Type 2 
    object 3 

私がそうしなければならないことは、指定されたドメイン内のオブジェクトのセットのすべての異なるタイプを取得し、それらを反復することです。私はそれらをドメインごとにしたいので、タイプの先頭から始めることはできません。

答えて

1

内部ループで直接Typesをクエリすることでこれを行うことができます。それを少し効率的にするためにprefetch_relatedを使用してください。

for dom in Domain.objects.all(): 
    for tp in Type.objects.filter(metaobject__domain=dom).prefetch_related('metaobject'): 
     print('Type {}'.format(tp)) 
     for mo in tp.metaobject_set.all(): 
      print(mo) 

もう1つのアプローチは、すべてのメタオブジェクトを取得し、Pythonでタイプごとに再グループ化することです。

+0

ありがとうございます。私はいつもpythonでこれをやっていることが十分にスケーラブルではないことを心配しています。しかし、私はそれを行かせます。 編集:2番目の声明を明確にすることはできますか? – Ewanw

+0

私はちょうどそれにいくつかのオプションを試して正直言って、それらのどれも私がすでに持っているものよりも良く見えませんでした。 –

+0

ごめんなさい。これをテンプレートにダンプする簡単な方法はありますか?私はそれらをすべてリストに追加して、そのように処理すると思います。私が尋ねる唯一の理由は、クエリーセットと比較してリスト記法が厄介である – Ewanw

関連する問題