如果我有两个表,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%}
非常感谢任何帮助。
答案 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家公司,以及他们各自的销售?一旦您做出决定,您就可以只查询所需的信息。