2009-08-18 68 views
0

如果我有兩個表格,即公司和銷售人員,並且想要在一個列表中顯示兩組數據,那麼我將如何使用GQL在Google App Engine上執行此操作?在Google AppEngine上合併兩個表格的最佳方式是什麼?

的車型有:


class Company(db.Model): 

    companyname = db.StringProperty()   
    companyid = db.StringProperty() 
    salesperson = db.StringProperty() 

class Sales(db.Model): 

    companyid = db.StringProperty() 

    weeklysales = db.StringProperty() 

    monthlysales = db.StringProperty() 

的意見是:


def company(request): 
    companys = db.GqlQuery("SELECT * FROM Company") 
    sales = db.GqlQuery("SELECT * FROM Sales") 
    template_values = { 
    'companys' : companys, 
    'sales' : sales 
    } 
    return respond(request, 'list', template_values) 

列表HTML包括:


{%for company in companys%} 
    {% for sale in sales %}  
    {% ifequal company.companyid sales.companyid %} 

    {{sales.weeklysales}} 
    {{sales.monthlysales}} 

    {% endifequal %} 
    {% endfor %} 

      {{company.companyname}} 
      {{company.companyid}} 
      {{company.salesperson}} 

{%endfor%} 

任何幫助將不勝感激。

回答

0

你應該在你的銷售模式使用ReferenceProperty

company = db.ReferenceProperty(Company)

如何通過對給定公司的銷售迭代的一個例子:

company = db.GqlQuery("SELECT * FROM Company").fetch(1)[0] 
for sale in company.sales_set: 
    #Do something ... 
+1

被警告,這會產生更多的查詢(每個公司1個,而不是2個)。因此它有可能會做更多的數據存儲請求。如果在查詢對象上迭代時,「銷售」對象的數量碰巧與自然請求大小大致相同,那麼它幾乎沒什麼區別,但我懷疑這可以算作。 – 2009-08-18 19:50:47

+1

不是更多的查詢,而是更多的數據存儲操作。解決引用屬性需要獲取數據存儲,這比查詢便宜得多。 – 2009-08-19 08:12:19

+1

感謝您的澄清 - 引用屬性的文檔說,「每個引用的實體獲取一個屬性,其值是一個查詢,返回所有引用它的實體」。所以我捍衛我的說法,即創建更多查詢(即查詢對象),並且當我指「數據存儲操作」時,我說「數據存儲請求」。 Query對象在使用時發出什麼樣的數據存儲操作,我請專家:-) – 2009-08-19 11:08:33

0
{%for company in companys%} 
    {% for sale in sales %}  
    {% ifequal company.companyid sales.companyid %} 

代碼是有問題的。如果您有200家公司和1000家銷售商,那麼您將運行ifequal語句200000次!

一般情況下,如果您有超過1000個銷售或公司,則根本無法工作,因爲您一次只能從數據存儲獲得1000個項目。 (如果你不打算有超過1000個項目,應用程序引擎可能是爲你的項目過度)

我認爲你的第一個目標應該是弄清楚你想如何打破你的列表成頁面。你想每頁顯示50個銷售嗎?或者每個頁面可能包含10家公司,以及他們各自的銷售額?一旦你決定,你可以只查詢你需要的信息。

+0

我試圖挽回800家銷售額超過800家的公司,銷售額和公司之間存在1:1的關係。我想這是問題所在:-)任何額外的幫助將是偉大的。 – gpjones 2009-08-19 07:40:09

+1

你真的想要一次顯示1600個項目給你的用戶嗎?他們能夠理解他們嗎? – 2009-08-19 08:13:01

1

你在評論中說過,銷售和公司之間存在着一種關係。所以你可以得到相同的順序的數據:

def company(request): 
    companys = db.GqlQuery("SELECT * FROM Company ORDER BY companyid").fetch(1000) 
    sales = db.GqlQuery("SELECT * FROM Sales ORDER BY companyid").fetch(1000) 
    template_values = { 
    'companys' : companys, 
    'sales' : sales 
    } 
    return respond(request, 'list', template_values) 

{%for company in companys%} 
    {{sales[forloop.counter0].weeklysales}} 
    {{sales[forloop.counter0].monthlysales}} 

    {{company.companyname}} 
    {{company.companyid}} 
    {{company.salesperson}} 
{%endfor%} 

雖然這仍然不是一個很好的解決方案。如果你確信1-1關係是正確的,那麼我只需要一個包含所有信息的實體。如果沒有別的辦法,它可以幫助您避免在創建公司時擔心數據庫不一致,但是由於某種原因,您嘗試創建相應的銷售數據實體失敗。

相關問題