0

比方说,我有一个模型:NDB查询与投影在()中.IN使用的属性

class Pet(ndb.Model): 
    age = ndb.IntegerProperty(indexed=False) 
    name = ndb.StringProperty(indexed=True) 
    owner = ndb.KeyProperty(indexed=True) 

而且我有一个名为owners键的列表。要为Pet就做一个查询,我会做:

pets = Pets.query(Pets.owner.IN(owners)).fetch() 

的问题是,该查询返回整个实体。

我该如何做一个预计的查询并获取所有者和名称?

或者我应该如何构造数据来获取名称和所有者。

我可以做一个name的预测,但我松了从宠物的所有者的参考。 owner不能在投影中。

+0

它总是由设计 – voscausa

+0

返回整个实体(对象)请澄清你的问题对我来说,因为如果你有keys.You的名单可以调用' (key).get()'并且它将带出你将选择你想要的propery的'entity'。同时通过密钥获取实体在应用引擎中是免费的! – Xenolion

回答

0

正如你已经注意到了,你不能做到这一点与你提到的具体情况下,因为你打Limitations on projections之一:

  • 属性在平等引用(=)或会员( IN)滤波器无法投射。

由于ownerIN滤波器它不能投影被使用。既然你需要owner,你不能投影它,你将不得不放弃投影,因此你将永远得到整个实体。

一种选择将是你的实体总是分裂成2个等实体,变成了1:1的关系,使用相同的实体ID:

class PetA(ndb.Model): 
    name = ndb.StringProperty(indexed=True) 
    owner = ndb.KeyProperty(indexed=True) 

class PetB(ndb.Model): 
    age = ndb.IntegerProperty(indexed=False) 

这样你就可以做同样的查询,除了在PetA而不是原来的Pet,结果你会得到相当于你正在寻找的原始投影查询。

不幸的是,这只适用于同一个实体的一个或几个这样的投影查询,否则你需要将实体拆分成太多块。所以你可能不得不妥协。

您可以找到有关实体的分裂更细节re-using an entity's ID for other entities of different kinds - sane idea?

+0

嗯,有趣的想法。谢谢。但是如果宠物只包含我需要的数据,你会说只索引“所有者”是一个好主意?这个名字没有必要,对吗?没有查询名称 –

+0

仅当您想要按“name”过滤或排序查询结果时,才需要索引'name'。 –