我有一個django的模型,Foo
,其具有各種公知的和命名一致的屬性(alpha
,beta
,...)以及的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.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()
但是,當查詢返回的foo
S> 1000,這是極其緩慢。 任何人都有任何改善表現的建議嗎?我有一種感覺,我失去了一些大...
查看此處生成的SQL是: https://docs.djangoproject。 com/en/dev/faq/models /#我怎麼能看到原始sql查詢Django運行 我想你可能會執行很多sql查詢,你可能實際上得到通過在Python中執行一些操作,性能更好 – JeffS 2012-08-15 16:01:46