2012-05-08 12 views
1

から「マトリックス」を行います。私はこれと同じモデルを持っているDjangoのクエリ

class MyModel(models.Model): 
    name = models.CharField(max_length = 30) 
    a = models.ForeignKey(External) 
    b = models.ForeignKey(External, related_name='MyModels_a') 

    def __unicode__(self): 
     return self.a + self.b.name + self.b.name 

私はそれを照会するときだから私はこのような何かを得る:

>>> MyModel.objects.all() 
[<MyModel: Name1AB>,<MyModel: Name2AC>,<MyModel: Name3CB>,<MyModel: Name4BA>,<MyModel: Name5BA>] 

を私がしたいですこのデータを以下のように表現する。

[[ []     , [Name1AB] , [Name2AC] ] 
[ [Name4BA, Name5BA] , []  , []  ] 
[ []     , [Name3CB] , []  ]] 

ご覧のとおり、モデルの行は「a」になります。カラムは 'b'になるでしょう 私はこれを行うことができますが、実際のデータベースでは多くのデータがあるため、時間がかかります。私はこれを行うには、ジャンゴが構築されているかどうかを知りたいです。

私はこのようにそれをやっている:

mymodel_list = MyModel.objects.all() 
external_list = External.objects.all() 

for i in external_list: 
    for j in external_list: 

     print(mymodel_list.filter(a=i).filter(arrl=j).all(),end='') 
     print() 

おかげ

答えて

1

これを行うには3つの方法がありますが、もう少し調べる必要があります。第3の選択肢1はあなたが探しているものに最も適しています。

1)Djangoはそれは長い時間がかかっている

理由は、あなたは常にこの行でデータベースにアクセスしているためである照会:

print(mymodel_list.filter(a=i).filter(arrl=j).all(),end='') 

あなたはDjangoのドキュメントは言うことを読んで開始する必要があり約the way of working with queries。あなたがしていることについては、フィルタを避けるアルゴリズムを作成する必要があります。 MyModel.objects.order_by( 'a')を使用すると、効率的なアルゴリズムを構築するのに役立ちます。

2){%ifchanged ...%}タグ

私はあなたの答えを投稿するプリントを使用しているが、あなたはおそらくHTMLでそれを必要とします。その場合、ifchangedタグについて読むことができます。これは、1つのdbアクセスだけでhtmlの行列を構築することを可能にします。

多くの関係に多くの

3)

あなたが非常に独特な方法で、多くの関係に多くをシミュレートする一種のようです。 Djangoはmany to many relationsをサポートしています。余分なフィールドが必要なので、thisも読まなければなりません。

最後に、データベースへのひとつのアクセスを試みている何をするために、私は、フィルタのドキュメントをチェックしますprefetch_related

+0

を読む必要があります。私はスクリプトをテストしているので私はプリントを使用しています(私たちはビューを作成するために近くにいません)。そして、それは '外部'では重複を持つことができないので、しかし、私はabがbaとは違うという意味で 'a'と 'b'の関係に興味があります。しかし、それらは素晴らしいアイデアです、私はこれをもう一度やり直すことができると思います。ありがとう – Darkade

0

(何を必要とすることは一般的ではありませんので)組み込みの方法はありません。手動で書く必要がありますが、完全なデータセット(または少なくとも1つのテーブル行のデータセット)を取得し、各テーブルセルにDBを打つ代わりにPythonで処理することをお勧めします。

関連する問題