Django查询后向ForeignKey关系的输出

时间:2012-08-15 15:03:10

标签: python mysql django

我有一个django模型Foo,它有各种已知且一致命名的属性(alphabeta,...)以及可变数量的实例Bar; Bar本身就是一个包含属性(namevalue,...)的模型。 我不能将每个bar的名称和值等作为Foo模型中的列,因为它们太多,它们有许多不同的名称,有些只适用于少数FOOS。 所以我在Bar模型中有一个ForeignKey关系,所以每个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,000 Foos和16,900,000 Bars(有索引等)。特别慢的是我的输出 - 我希望能够使用属性列编写文本文件:foo.alphafoo.betafoo.bar1.valuefoo.bar2.value等。 。 其bar1属性选择bar2name等。我一直在尝试输出字段列表:

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时,这非常慢。 有人提出改善表现的建议吗?我有一种感觉,我错过了一些大事......

2 个答案:

答案 0 :(得分:0)

如果您仅使用Foo来限制Bar,那么只需缩小Foo即可提高效率。

bars = Bar.objects.filter(foo__alpha__lte=10, name__in=('prop1', 'prop2', 'prop5'))

答案 1 :(得分:0)

另外根据文档,如果模型Foo(models.Model):bar = models.ForeignKey(Bar),则模型Foo和模型栏都获得model_set属性。即,你可以调用Foo.bar_set.all()来检索与foo相关的所有条形,反之亦然,为Bar.foo_set.all()