在Google AppEngine上合并两个表的最佳方法是什么?

时间:2009-08-18 19:00:18

标签: python google-app-engine

如果我有两个表,Company和Sales,并且我想在一个列表中显示这两组数据,我将如何使用GQL在Google App Engine上执行此操作?

模型是:


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%}

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

你在评论中说,销售和公司之间存在1-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关系是正确的,那么我只需要一个包含所有信息的实体。如果没有别的,它可以让您担心在创建公司时担心数据库不一致,但是由于某种原因,您尝试创建相应的销售数据实体会失败。

答案 1 :(得分:0)

您应该在销售模型中使用ReferenceProperty

company = db.ReferenceProperty(Company)

关于如何遍历给定公司的销售的示例:

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

答案 2 :(得分:0)

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

该代码存在问题。如果你有200家公司和1000个销售,你将运行ifequal声明200000次!

通常,如果您有超过1000个销售或公司,这根本不起作用,因为您一次只能从数据存储区获得1000个项目。 (如果您没有计划拥有超过1000个项目,那么应用程序引擎可能对您的项目来说太过分了)

我认为你的第一个目标应该是弄清楚你想如何将你的列表分成几页。您想要每页显示50个销售额吗?或者每页10家公司,以及他们各自的销售?一旦您做出决定,您就可以只查询所需的信息。