【问题标题】:NDB query using filters on Structured property which is also repeated ?使用结构化属性上的过滤器进行 NDB 查询,这也是重复的?
【发布时间】: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 属性中具有至少一个 MyDatastrength > 30(您是查询MyUser)。我现在用完整的代码添加一个答案来实现你想要的

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


【解决方案1】:

StructuredProperties 上的查询返回至少有一个结构化属性满足条件的对象。如果您想过滤这些属性,则必须在之后进行。

这样的事情应该可以解决问题:

def queryMyUserWithStructuredPropertyFilter():
    shail_users_query = MyUser.query(MyUser.email_id == "napolean@gmail.com", MyUser.my_data.strength > 30)
    shail_users_list = shail_users_query.fetch(10)

    # Here, shail_users_list has at most 10 users with email being
    # 'napolean@gmail.com' and at least one element in my_data
    # with strength > 30

    maindatalist = [
        [[data.strength, str(data.date)] for data in user.my_data if data.strength > 30] for user in shail_users_list
    ]

    # Now in maindatalist you have ONLY those my_data with strength > 30
    return maindatalist

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多