0

我有一个 django 模型,Foo它具有各种已知且一致命名的属性(alpha、、beta...)以及可变数量的Bar; Bar本身就是一个具有属性 ( name, value, ...) 的模型。我不能将每个bar的名称和值等作为Foo模型中的列,因为它们太多了,它们有许多不同的名称,有些仅适用于几个 foo。所以我在模型中有一个 ForeignKey 关系Bar,所以每个人都bar知道foo它属于哪个,我可以使用 Django 的select_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.value, foo.bar2.value, 等...其中bar1,bar2等由它们的name属性选择。我一直在尝试输出字段列表:

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

但是当查询返回 >1000s 时,这非常慢foo。有人对这里提高性能有任何建议吗?我觉得我错过了一些大事...

4

2 回答 2

0

同样根据文档 if model Foo(models.Model): bar = models.ForeignKey(Bar) ,那么 model Foo 和 model bar 都获得 model_set 属性。即您可以调用 Foo.bar_set.all() 来检索与 foo 关联的所有柱,反之亦然 Bar.foo_set.all()

于 2012-08-18T02:22:30.787 回答
0

如果你只使用Footo limit Bar,那么你可以通过 cut out 来提高效率Foo

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