我有两种实体,一种是指其他类型:
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的那些实体。
答案 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'
但显然这不是最好的方法。让我们等待更好的答案!