Python 向后ForeignKey关系的Django查询输出
我有一个django模型,Python 向后ForeignKey关系的Django查询输出,python,mysql,django,Python,Mysql,Django,我有一个django模型,Foo,它有各种已知的和一致命名的属性(alpha,beta,…),以及不同数量的Bar栏本身就是一个带有属性的模型(名称,值,…)。 我不能将每个条的名称和值等作为Foo模型中的一列,因为它们太多了,它们有许多不同的名称,有些仅适用于少数Foo。 因此,我在Bar模型中有一个外键关系,因此每个Bar都知道它属于哪个foo,我可以使用Django的select_related(),例如: foos = Foo.objects.filter(alpha__lte=10).
Foo
,它有各种已知的和一致命名的属性(alpha
,beta
,…),以及不同数量的Bar
<代码>栏本身就是一个带有属性的模型(名称
,值
,…)。
我不能将每个条
的名称和值等作为Foo
模型中的一列,因为它们太多了,它们有许多不同的名称,有些仅适用于少数Foo。
因此,我在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组织数据的最佳方式吗
如果我在正确的轨道上,我还有另一个问题:我怎样才能加快速度?我应该补充一点,我总共有2700000个Foos
和16900000个条
(有索引等)。我的输出速度特别慢——我希望能够编写包含以下属性列的文本文件:foo.alpha
、foo.beta
、foo.bar1.value
、foo.bar2.value
,等等。。。
其中,bar1
,bar2
等由其名称
属性选择。我一直在试验一系列输出字段:
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
s时,速度非常慢。
有人对提高绩效有什么建议吗?我有一种感觉,我错过了一些重要的东西…如果你只使用
Foo
来限制条
,那么你只需删掉Foo
就可以提高效率
bars = Bar.objects.filter(foo__alpha__lte=10, name__in=('prop1', 'prop2', 'prop5'))
同样根据文档,如果model Foo(models.model):bar=models.ForeignKey(bar),那么model Foo和model bar都获得model\u set属性。i、 e.您可以调用Foo.bar\u set.all()来检索与Foo相关的所有条,反之亦然。对于bar.Foo\u set.all(),通过在Python中执行某些操作,实际上可以获得更好的性能