2009-08-18 11 views
0

두 개의 테이블 Company와 Sales가 있고 두 데이터 세트를 단일 목록에 표시하려는 경우 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 개). 따라서 더 많은 데이터 저장소 요청을 할 가능성이 있습니다. 쿼리 객체를 반복 할 때 "sales"객체의 수가 자연 요청 크기와 거의 같아지면 약간의 차이는 있지만 그 수를 계산할 수 있을지는 의문입니다. –

+1

더 이상 쿼리가 아니며 데이터 저장소 작업이 더 많습니다. 참조 속성을 해결하려면 데이터 스토어 get이 필요합니다. 이는 쿼리보다 훨씬 저렴합니다. –

+1

설명 주셔서 감사합니다. 참조 속성에 대한 문서에 "각 참조 된 엔터티는 그 값이 해당 엔터티를 참조하는 모든 엔터티를 반환하는 쿼리입니다"라는 메시지가 표시됩니다. 따라서 더 많은 쿼리 (즉, 쿼리 개체)를 생성한다는 주장을 옹호하며 "데이터 저장소 작업"을 의미 할 때 "데이터 저장소 요청"을 말합니다. 쿼리 개체를 사용할 때 어떤 종류의 데이터 저장소 작업을 사용합니까? 전문가에게 맡깁니다. : –

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

그 코드입니다 문제. 200 개의 회사와 1000 개의 판매가 있다면, 당신은 200,000 번 ifequal statement를 실행할 것입니다!

일반적으로 1000 개 이상의 판매 또는 회사가있는 경우 데이터 저장소에서 한 번에 1000 개의 항목 만 가져올 수 있기 때문에 전혀 작동하지 않습니다. (만약 당신이 1000 개 이상의 아이템을 가지고 있다고 생각하지 않는다면, 당신의 프로젝트를 위해 앱 엔진이 과잉 공격 일 것입니다.)

당신의 첫 번째 목표는 당신의리스트를 어떻게 페이지로 나누고 싶을 지 생각하는 것입니다. 페이지 당 50 개의 판매를 표시 하시겠습니까? 또는 페이지 당 10 개의 회사와 각각의 판매가있을 수 있습니까? 일단 결정하면 필요한 정보 만 쿼리 할 수 ​​있습니다.

+0

나는 800 개의 판매로 800 개의 회사를 되 찾으려하고 있는데, 판매와 회사의 관계는 1 : 1입니다. 나는 이것이 문제가있는 곳이라고 생각한다 :-) 추가 도움이 크다. – gpjones

+1

사용자에게 1600 개의 항목을 한 번에 표시 하시겠습니까? 그들은 그것들을 이해할 수 있을까요? –

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 관계가 정확하다고 확신한다면, 나는 모든 정보를 담고있는 하나의 엔티티 만 가지게 될 것입니다. 그렇지 않으면 회사를 만들 때 데이터베이스 불일치에 대해 걱정할 필요가 없지만 어떤 이유로 판매 데이터 엔티티를 생성하려는 시도가 실패합니다.

관련 문제