NDB StructuredProperty查询意外结果

时间:2018-12-03 07:55:33

标签: python google-app-engine app-engine-ndb

我有这个模型:

class State(ndb.Model):
  code = ndb.StringProperty(required=True)
  name = ndb.StringProperty(required=True)
  city_list = ndb.StructuredProperty(City, repeated=True)
  country = ndb.KeyProperty(required=True)

class City(ndb.Model):
  code = ndb.StringProperty(required=True)
  name = ndb.StringProperty(required=True)

我实现了以下查询:

 stateData = State.query( State.city_list.name == 'xyz', State.name=='Punjab' ).fetch()

我想在名称为State的{​​{1}}上实现查询。但是Punjab有许多城市,因此我按城市名Punjab进行了过滤。

我只期望xyz城市,但我得到了所有城市。

我如何才能只得到xyz城市?

2 个答案:

答案 0 :(得分:3)

您要查询State种,因此结果将是具有{em> complete State属性的city_list个实体-您不能仅获得一个city_list的子集。因此,您所期望的就是如此。

您可能会进行投影查询,在这种情况下,您将获得State个实体的列表,每个实体在city_list中只有一个城市,请参见Projections and multiple-valued properties。注意limitations

或者您可以重新设计模型,也许可以使用单独的City实体直接查询(而不是State实体内部的结构化属性)。

答案 1 :(得分:0)

您应该先过滤一下,然后再提取。以下语法基于您使用Key属性

的旧版ndb
class State(ndb.Model):
  code = ndb.StringProperty(required=True)
  name = ndb.StringProperty(required=True)
  city_list = ndb.KeyProperty(kind=City, repeated=True)
  country = ndb.KeyProperty(required=True)

stateq = State.query( State.name=='Punjab' )
city=stateq.filter(State.City==citykey)
result=city.fetch()

我没有尝试过,但它也可能适用于结构化财产。