2012-08-15 86 views
0

我有一个django的模型,Foo,其具有各种公知的和命名一致的属性(alphabeta,...)以及的Bar实例的可变数目; Bar本身就是一个具有属性的模型(name,value,...)。 我不能在Foo模型中将每个bar的名称和值等作为列,因为它们太多了,它们有许多不同的名称,有些只适用于少数几个foos。 所以我有Bar模型中一个ForeignKey关系,所以每个bar知道它属于哪个foo,我可以使用Django的select_related(),如:Django的输出查询ForeignKey的关系

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等.. 其中bar1bar2等等都由他们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() 

但是,当查询返回的foo S> 1000,这是极其缓慢。 任何人都有任何改善表现的建议吗?我有一种感觉,我失去了一些大...

+0

查看此处生成的SQL是: https://docs.djangoproject。 com/en/dev/faq/models /#我怎么能看到原始sql查询Django运行 我想你可能会执行很多sql查询,你可能实际上得到通过在Python中执行一些操作,性能更好 – JeffS 2012-08-15 16:01:46

回答

0

如果你只使用Foo来限制Bar,那么你可以通过简单地删除Foo来提高效率。

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

唉,我需要我的foo属性(alpha,beta)以及它们的bar属性的一个子集。 – xnx 2012-08-15 15:13:40

0

此外,根据本文档如果模型的Foo(models.Model):巴= models.ForeignKey(BAR),那么这两个模型Foo和模型栏得到model_set属性。即您可以调用Foo.bar_set.all()来检索与foo相关的所有酒吧,反之亦然Bar.foo_set.all()