2010-12-12 5 views
0

나는 몇 시간 동안이 문제를 해결하기 위해 애썼다. 내가 간과 할 수있는 간단한 해결책이 있음을 알고있다.html 템플릿과 모델 관계

저는 모델과 일대일 관계가 있습니다.

관련 개체의 행이있는 한 개체의 모든 행을 반환해야합니다. 나는이 좋은 모두를 실행할 수 있습니다,하지만 난 다시 HTML 템플릿에이를 보낼 때이 문제로 실행 - 이제

object 
object 
    object_relationship.property 
    object_relationship.property 
object 
    object_relationship.property 
object 

: 의미에서

나는이 있습니다.

개체를 다시 보낼 수는 있지만 위의 순서대로 object_relationship을 다시 보내려면 어떻게해야합니까?

의미가 있습니까?

답변

0

내 첫 번째 제안은 이와 같은 많은 보고서를 수행하려는 경우 데이터를 비정규 화하는 것입니다. 예를 들어 object_relationship 엔티티에 object.name을 포함 할 수 있습니다.

data = [] 
for entity in your_query: 
    children = [{'name': child.name} for child in entity.object_relation] 
    data.append({'name': object.name, 
       'children': children, 
       ... 
       }) 

그런 다음 템플릿에 data 목록을 전달하고이를 처리 : 말했다

, 당신은 어쩌면 무언가 같이, 템플릿에 dicts의 목록을 보낼 수 있습니다.

매우 잘 수행됩니다. 에 대한 다른 쿼리를 첫 번째 쿼리의 항목 중 하나 인을 모두 실행합니다. 앱을 프로파일 링하려면 Appstats을 사용하십시오.

+0

고마워 로버트 - 그 트릭을 했어. 나는 성능에 동의한다. 우리는 이것을 곧 비정규 화해야 할 수도있다. – sampyxis

2

하는 당신은이 모델을보고 ... acutally, 이것에 대해 너무 걱정하지 않아도됩니다 :

class Venue(base.NamedEntity, HasPerformances, HasUrl, HasLocation): 
    city = db.ReferenceProperty(City, collection_name='venues') 
    url = db.StringProperty(required=True, validator=validators.validate_url) 
    location = db.GeoPtProperty() 

class Performance(base.Entity): 
    show = db.ReferenceProperty(Show, collection_name='performances', required=True) 
    utc_date_time = db.DateTimeProperty(required=True) 
    venue = db.ReferenceProperty(Venue, collection_name='performances', required=True) 

을 이런 경우에, 아무것도 코드 나 템플릿 중 하나에서 venue.performances를 사용하여 치료에서 당신을 중지하지 그것은 목록으로. API는 실제 객체를 가져 오는 데 필요한 쿼리를 자동으로 실행합니다. performance.venue도 마찬가지입니다.

유일한 문제는 성능입니다. n+1 problem의 변형을 처리해야합니다. Nick Johnson의 this article과 같은 해결 방법이 있습니다. 너무 API 코드를 읽는 것이 좋습니다 ... 흥미로운 독서 속성을 얻는 방법을 캡처 한 및 dereferenced 있습니다.