0

私はdjangoモデルを持っていFooます。これには、さまざまな既知の一貫した名前の属性(alpha、、beta...)と、可変数のBar;のインスタンスがあります。それ自体が属性( 、、...)Barを持つモデルです。それぞれの名前や値などをモデルの列として持つことはできません。それらの数が多すぎて、名前が異なり、一部は少数のfooにのみ適用されるためです。したがって、モデル内にForeignKey関係があるので、それぞれがそれが属するものを知っており、Djangoを使用できます。例:namevaluebarFooBarbarfooselect_related()

foos = Foo.objects.filter(alpha__lte=10).select_related()
for foo in foos:
    bars = foos.bar_set.filter(name__in=('prop1', 'prop2', 'prop5'))
    for bar in bars:
        print '%s = %d' % (bar.name, bar.value)

これはうまくいくようです...しかし、MySQLでデータを整理するための本当に最良の方法ですか?

私が正しい方向に進んでいる場合、別の質問があります。どうすればこれをスピードアップできますか?合計で2,700,000Foosと16,900,000があることを付け加えておきBarsます(インデックスが設定されているなど)。私の出力は特に遅いです-プロパティの列を持つテキストファイルを書きたいです:、、、、foo.alphaなど...ここでfoo.beta、、などは属性によって選択されます。私は出力フィールドのリストを試してきました:foo.bar1.valuefoo.bar2.valuebar1bar2name

bar_output_fields = ['prop1', 'prop2', 'prop5']
all_output_fields = [('%4d', 'alpha'),
                     (%12.6f', 'prop1'), 
                     (%10.3e', 'beta'),
                     (%10.3e', 'prop2')
                     ('%2d', 'prop5')]
fo = open('output.txt', 'w')
for foo in foos:
    bars = foos.bar_set.filter(name__in=bar_output_fields)
    for bar_output_field in bar_output_fields:
        bar = bars.filter(name=bar_output_field).get()
        setattr(foo, bar_output_field, bar.value)
    for (fmt, name) in all_output_fields:
        print >>fo, fmt % getattr(foo, name),
    print >>fo
fo.close()

ただし、クエリが1000秒を超える値を返す場合、これは非常に遅くなりますfoo。ここでパフォーマンスを改善するための提案はありますか?何か大きなものが欠けているような気がします...

4

2 に答える 2

0

Foolimitのみを使用している場合はBar、 を切り取るだけでより効率的にすることができますFoo

bars = Bar.objects.filter(foo__alpha__lte=10, name__in=('prop1', 'prop2', 'prop5'))
于 2012-08-15T15:07:26.320 に答える
0

また、ドキュメントによると、モデル Foo(models.Model): bar = models.ForeignKey(Bar) の場合、モデル Foo とモデル バーの両方が model_set 属性を取得します。つまり、Foo.bar_set.all() を呼び出して foo に関連付けられたすべてのバーを取得したり、逆に Bar.foo_set.all() を呼び出したりすることができます。

于 2012-08-18T02:22:30.787 に答える