쿼리

2011-03-28 6 views
2

내가 두 엔티티 종류가 다른 등을 언급 한 : prop3가 기준을 가지고 것입니다 여기에쿼리

q=Entity2.all().filter("prop3.prop1 =",somevalue) 

:

class Entity1(db.Expando): 
    prop1=db.StringProperty() 
    prop2=db.StringProperty() 

class Entity2(db.Expando): 
    prop3=db.ReferenceProperty(Entity1) 
    prop4=db.StringProperty() 

내가 좋아하는 쿼리를 쓸 수 어떤 Entity1의 엔터티를 참조하고 prop1을 somevalue로 갖는 Entity1의 엔터티를 참조하는 Entity2의 모든 엔터티를 알고 싶습니다.

답변

0

같이 2 엔티티를 정의

class Entity2(db.Expando): 
    entity_1_ref = db.ReferenceProperty(Entity1, collection_name = "set_of_entity_2_elements") 
    prop4=db.StringProperty() 

이것은 기준의 반대편에서 동작 할 수있는 모음 이름을 정의한다. (이 경우 엔티티 1). 나는 prop3의 이름을 더 적절한 것으로 바꾸도록 자유를 취했습니다.

이제는 원하는 결과를 얻을 수있는 q = entity_1_object.set_of_entity_2_elements (모든 Entity1 개체의 새 속성)을 수행 할 수 있습니다.

자세한 내용은이 문서를 심층적으로 다룬 읽기 : http://code.google.com/appengine/articles/modeling.html

업데이트 : 미안 해요, 잘못되었다.

for obj in q: 
    if (obj.prop1 == somevalue): 
     # Do your processing here 

또는

for obj in q: 
    if (obj.prop1 != somevalue): 
     # Delete this object from the list 'q' 

을하지만, 분명히이 가장 좋은 방법이 아니다 다음과 같이 위의 제안은 방법에 대한 라운드에서 당신은 아직도 그것을 얻을 수 entity_1_object.prop1 == somevalue

만 이러한 요소를 얻을 나던 . 더 나은 대답을 기다릴 수 있습니다!

+0

고맙습니다하지만 내 경우에는이 늘 일 각의 수동 검사를 피할 수 있기 때문에 엔티티 ReferenceProperty를 사용하려고했지만 다시는 내 목적이 해결되지 않는 것처럼 보입니다. 좋아, 더 나은 대답을 기다릴 수 있습니다. – niteshb

+1

@ user617462 : 더 좋은 대답을 얻지 못할 것입니다. 데이터 저장소는 조인을 수행하지 않습니다. 이 쿼리를 정기적으로 수행해야하는 경우 두 번째 모델에서 참조 된 엔터티의 'prop1'값을 포함하여 비정규 화해야합니다. – geoffspear

1

Google Datastore는 조인을 지원하지 않습니다. Entity2의 모든 엔티티를 가져올 수 있고 당신이 말한 것을 성취 할 수있는 조작을합니다. @Mani가 제안한 것과 다소 비슷합니다. 하지만 당신은 내가 처음 referenceproperty 쿼리에 대한 필터로 사용하기위한 키를 가져 내 예에서

entities2 = Entity2.all() 
for entity2 in entities2: 
    Entity1= entity.prop3.get() 
    if Entity1.prop1== somevalue: 
     #Do your processing here 
+0

예, 그렇습니다.하지만 엔티티의 수가 매우 많기 때문에 많은 시간이 필요하며 목적이 해결되지 않았으므로 단일 쿼리로 처리하려고했습니다. 이는 수동 검사 일뿐 쿼리가 아닌 것 같습니다. – niteshb

+0

그런 식으로 모델을 비정규 화해야합니다. 당신이 말한 것은 단일 쿼리로는 불가능합니다. 참조 속성은 키를 저장하기 만하면 가져올 수없는 속성을 액세스 할 수 없습니다. –

2

처럼 그것을 할 수 있습니다. 그런 다음 키를 찾은 쿼리 양과 동일한 양의 키를 기반으로 필터링을 수행 할 수 있습니다.

예 :

모델 :

class Order(db.Model): 
    waiter = db.ReferenceProperty(Waiter,required=True) 
    date=db.DateTimeProperty(required=True) 
    delivered=db.BooleanProperty(default=False) 

class Waiter(db.Model): 
    firstname=db.StringProperty(required=True) 
    lastname=db.StringProperty(required=True) 
    uuid=db.StringProperty(required=True) 

웹 요청 기능 : 답변

def get(self): 
     waiteruuid=self.request.get("waiter") 
     q=Waiter.all() 
     q.filter('uuid =', waiteruuid) 
     waiterkey=q.get() 
     result={} 
     result['orders']=[] 
     q=Order.all() 
     if waiteruuid: 
      q.filter('waiter =', waiterkey) 
     orders=q.run()