2011-01-18 4 views
18

Google App Engine에는 항목 목록 (배열)을 보유 할 수있는 ListProperty 같은 것이 있습니다. 보관중인 항목의 유형 (예 : 문자열, 정수 등)을 지정할 수도 있습니다.Google App Engine Python 용 참조 목록

Google App Engine을 사용하면 참조 속성을 가질 수도 있습니다. ReferenceProperty는 다른 Google App Engine Model 엔티티에 대한 참조를 "포함합니다". ReferenceProperty에 액세스하면 참조가 가리키는 실제 엔티티가 자동으로 검색됩니다. 이것은 키를 얻는 것보다 뛰기 쉽고, 그런 다음 키에 대한 엔티티를 가져 오는 것이 편리합니다.

그러나 ListReferenceProperty (또는 ReferenceListProperty)와 같은 것은 표시되지 않습니다. 다른 엔티티에 대한 참조 목록을 보유하고 싶습니다. 목록의 요소에 액세스하려고하면 자동으로 해결됩니다. 내가 얻을 수있는 가장 가까운 것 db.Key 개체 목록을 보유하는 것 같습니다. 이 키를 사용하여 수동으로 관련 엔터티를 서버에서 검색 할 수 있습니다.

좋은 해결책이 있습니까? 기본적으로 다른 엔티티에 대한 참조 (자동 참조 해제) 모음이있는 기능을 원합니다. 나는 다른 엔터티에 대한 키 모음을 가지고 거의 거기에 갈 수 있지만 키 항목이라는 것을 "알기"를 바란다. 그리고이 키를 서비스로 참조 할 수있다.

답변

13

단계 :

사용 db.ListProperty (db.Key는) 관계를 만들 수 있습니다. ListProp이 Many to Many 관계에서 더 적은 참조를 갖는 엔터티에 있도록합니다. 이것은 또한 당신에게 역 참조를 줄 것이다. 따라서 :

class Spam 
    prop1 = db.String 
    eggs = db.List 

class Eggs 
    prop1 = db.string 
    @property 
    def spams(self): 
    return Spam.all().filter('eggs', self.key()) 

이것은 두 가지 방법으로 참조를 제공합니다.

2 단계 :

속성을 derefrences utlility 방법을 만듭니다.

def prefetch_refprops(entities, *props): 
    """Dereference Reference Properties to reduce Gets. See: 
    http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine 
    """ 
    fields = [(entity, prop) for entity in entities for prop in props] 
    ref_keys = [prop.get_value_for_datastore(x) for x, prop in fields] 
    ref_entities = dict((x.key(), x) for x in db.get(set(ref_keys))) 
    for (entity, prop), ref_key in zip(fields, ref_keys): 
     prop.__set__(entity, ref_entities[ref_key]) 
    return entities 

사용법은 다음과 같습니다

derefrenced_spams = prefetch_refprops(Spams, models.Spam.eggs)  
+0

스티븐이 시도 했습니까? 이 방법은 항상 사용되며 Google App Engine IRC에서 어울리는 사람들이 제안했습니다. –

+0

죄송합니다. 현재 반복 루프에서 빠져 나가 자마자 시도해 보겠습니다. 당신의 응답을 주셔서 감사합니다. –

+0

예, 뭔가 있습니다. 그것이 그것이 참고 문헌의 목록이었고 모든 것을 이해하고있는 실제의 속성이라면 나는 깔끔할 것입니다. 이것은 내가 지금까지 본 최고의 대답이다. –

6

네 말이 맞아, 더는 ReferenceListProperty 내장 없다 감사드립니다. 사용자 정의 속성 하위 클래스는 일반적으로 매우 쉽습니다.하지만 참조를 참조하고 캐싱하는 데는 생각보다 어렵습니다.

db.ListProperty(db.Key)을 사용할 수 있지만 키 목록을 저장할 수 있습니다. 그런 다음 일괄 처리 db.get() 작업을 사용하여 개별적으로 또는 모두를로드 할 수 있습니다. 이를 위해서는 직접 해결 단계를 수행해야하지만 엔티티를 참조 해제 할 때보다 효과적으로 제어 할 수 있습니다.