2012-05-08 80 views
1

我有類似這樣的一個模型的「矩陣」:建立從Django的查詢

class MyModel(models.Model): 
    name = models.CharField(max_length = 30) 
    a = models.ForeignKey(External) 
    b = models.ForeignKey(External, related_name='MyModels_a') 

    def __unicode__(self): 
     return self.a + self.b.name + self.b.name 

所以,當我查詢它,我得到這樣的:

>>> MyModel.objects.all() 
[<MyModel: Name1AB>,<MyModel: Name2AC>,<MyModel: Name3CB>,<MyModel: Name4BA>,<MyModel: Name5BA>] 

而且我想代表這些數據類似於以下內容。

[[ []     , [Name1AB] , [Name2AC] ] 
[ [Name4BA, Name5BA] , []  , []  ] 
[ []     , [Name3CB] , []  ]] 

正如你可以看到行將在模型中'a'而列將是'b' 我可以做到這一點,但這需要很長時間,因爲在真實數據庫中我有很多數據。我想知道是否有構建Django的方式來做到這一點。

我做這樣的:

mymodel_list = MyModel.objects.all() 
external_list = External.objects.all() 

for i in external_list: 
    for j in external_list: 

     print(mymodel_list.filter(a=i).filter(arrl=j).all(),end='') 
     print() 

感謝

回答

1

這樣做的三種方式,但你將不得不多研究一下。第三種選擇可能是最適合你所尋找的。

1)Django的查詢

它花費很長的時間,就是因爲你經常訪問該行的數據庫:

print(mymodel_list.filter(a=i).filter(arrl=j).all(),end='') 

您可能要開始閱讀Django文檔說什麼約the way of working with queries。對於你在做什麼,你必須創建算法來避免過濾器。使用MyModel.objects.order_by('a')可以幫助您構建高效的算法。

2){%ifchanged ...%}標籤

我想你正在使用的打印張貼您的答案,但你可能需要在HTML中。在這種情況下,您可能需要閱讀ifchanged標籤。它將允許你只用一個數據庫訪問就可以在html中建立你的矩陣。

3)多對多關係

看來你是那種模擬多對多關係中一個非常特殊的方式。 Django支持many to many relations。您需要額外的字段,因此您還需要閱讀this

最後,做什麼,你都只有一個訪問數據庫的嘗試,你會需要閱讀prefetch_related

+0

我會檢查文件的過濾器。我正在使用print,因爲我正在測試一個腳本(我們遠沒有開始製作視圖)而且它不是很多人,因爲在'external'中我不能有重複;然而,我對'a'和'b'之間的關係感興趣,因爲ab與ba不同。但這些都是很棒的想法,我想我可以再次開始研究,謝謝 – Darkade

0

有沒有內置的方式(因爲你需要的是不常見)。你應該手動編寫它,但我建議檢索完整的數據集(或至少一個錶行的數據集),並在Python中處理它,而不是在每個表格單元格中打DB。