【发布时间】:2015-03-20 13:08:58
【问题描述】:
我正在创建一个示例应用程序,用于存储用户详细信息及其类信息。
正在使用的模态类是:
保存用户类数据的模型类
class MyData(ndb.Model):
subject = ndb.StringProperty()
teacher = ndb.StringProperty()
strength = ndb.IntegerProperty()
date = ndb.DateTimeProperty()
用户模型类
class MyUser(ndb.Model):
user_name = ndb.StringProperty()
email_id = ndb.StringProperty()
my_data = ndb.StructuredProperty(MyData, repeated = True)
我能够成功地将数据存储到数据存储中,还可以使用一些基于 email_id 和 user_name 的过滤器对 MyUser 实体进行简单查询。
但是,当我尝试使用来自 MyUser 模式的结构化属性 my_data 的属性上的过滤器查询 MyUser 结果时,它没有给出正确的结果。
我想我查询不正确。 这是我的查询功能
根据重复结构属性进行查询的函数
def queryMyUserWithStructuredPropertyFilter():
shail_users_query = MyUser.query(ndb.AND(MyUser.email_id == "napolean@gmail.com", MyUser.my_data.strength > 30))
shail_users_list = shail_users_query.fetch(10)
maindatalist=[]
for each_user in shail_users_list:
logging.info('NEW QUERY :: The user details are : %s %s'% (each_user.user_name, each_user.email_id))
# Class data
myData = each_user.my_data
for each_my_data in myData:
templist = [each_my_data.strength, str(each_my_data.date)]
maindatalist.append(templist)
logging.info('NEW QUERY :: The class data is : %s %s %s %s'% (each_my_data.subject, each_my_data.teacher, str(each_my_data.strength),str(each_my_data.date)))
return maindatalist
我想获取具有重复结构化属性 (my_data) 的实体应该是一个强度 > 30 的列表。
请帮助我知道我哪里做错了。
谢谢。
【问题讨论】:
-
查询重复的结构化属性是在您执行此操作时完成的,所以看起来没问题...您希望看到什么以及实际得到什么? (顺便说一句:查询 email_id 和 my_data.strength 时不需要使用 ndb.AND:AND 是那里的默认值)
-
实际上过滤器工作不正常。对于那个特定的 MyUser 实体,我一直在添加多个 MyData 类型的结构化属性,正如您在模态中看到的那样。我只需要类强度大于 30 的 MyData 属性的最终数据。但是当我执行 query 时,不会发生过滤,并且我保存了所有 MyData 属性。
-
第 2 行中的查询将返回所有
MyUser对象,这些对象在其my_data属性中具有至少一个MyData和strength > 30(您是查询MyUser)。我现在用完整的代码添加一个答案来实现你想要的
标签: python google-app-engine google-cloud-datastore app-engine-ndb