Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向后ForeignKey关系的Django查询输出_Python_Mysql_Django - Fatal编程技术网

Python 向后ForeignKey关系的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).

我有一个django模型,
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中执行某些操作,实际上可以获得更好的性能