1

私はこれに似たモデルを持っています:

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」になります。これは可能ですが、実際のデータベースには大量のデータがあるため、時間がかかります。これを行うためにDjangoが組み込まれているかどうか知りたいのですが。

私はこのようにやっています:

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()

ありがとう

4

2 に答える 2

1

それを行うには3つの方法がありますが、もう少し研究する必要があります. 3 番目のオプションは、探しているものに最も適している場合があります。

1) Django クエリ

時間がかかる理由は、次の行でデータベースに常にアクセスしているためです。

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

クエリの操作方法について Django のドキュメントに書かれていることを読み始める必要があるかもしれません。あなたがしていることのために、フィルターを避けるためにアルゴリズムを作成する必要があります。MyModel.objects.order_by('a') を使用すると、効率的なアルゴリズムを構築するのに役立つ場合があります。

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

回答を投稿するために印刷を使用していると思いますが、おそらくhtmlで必要です。その場合、ifchangedタグについて読みたいと思うかもしれません。たった 1 回の db アクセスで、マトリックスを html で構築することができます。

3) 多対多の関係

非常に独特な方法で多対多の関係をシミュレートしているようです。Django は多対多の関係をサポートしています。追加のフィールドが必要になるため、これも読む必要があります

最後に、データベースへの 1 回のアクセスで試みていることを実行するには、 prefetch_relatedを読み取る必要があります。

于 2012-05-08T05:05:25.647 に答える
0

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

于 2012-05-08T04:47:21.460 に答える