2012-08-15 108 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()