2009-08-18 34 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关系是正确的,那么我只需要一个包含所有信息的实体。如果没有别的办法,它可以帮助您避免在创建公司时担心数据库不一致,但是由于某种原因,您尝试创建相应的销售数据实体失败。

相关问题