查询Google App Engine中的ReferenceProperty

时间:2011-03-28 07:50:21

标签: python google-app-engine

我有两种实体,一种是指其他类型:

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

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

我可以编写如下查询:

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

这里prop3有一个引用,并且将引用类Entity1的某个实体,我想知道实体2的所有实体,它们引用具有prop1作为somevalue的Entity1的那些实体。

3 个答案:

答案 0 :(得分:2)

在我的示例中,我首先获取了referenceproperty的键,以用作查询的过滤器。然后,您可以根据您找到的相同数量的查询中的密钥进行过滤。

一个例子:

模特:

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()

答案 1 :(得分:1)

Google Datastore不支持加入。你可以获取Entity2的所有内容,并进行一些操作来实现你所说的内容。有些类似于@Mani的建议。但你可以像

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

答案 2 :(得分:0)

将实体2定义为:

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

这定义了一个集合名称,可以从引用的另一侧进行操作。 (在这种情况下为Entity1)。我已经冒昧地将prop3重命名为更合适的东西。

现在您可以q = entity_1_object.set_of_entity_2_elements(所有Entity1对象的新属性),它将为您提供所需的结果。

有关详细信息,请深入阅读本文:http://code.google.com/appengine/articles/modeling.html

更新:抱歉,我弄错了。上述建议不仅仅包含entity_1_object.prop1 == somevalue

的元素

你仍然可以通过以下方式获得它:

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'

但显然这不是最好的方法。让我们等待更好的答案!