NDB 查询在结构化 属性 上使用过滤器,这也被重复了吗?

NDB query using filters on Structured property which is also repeated ?

我正在创建一个存储用户详细信息及其 class 信息的示例应用程序。

正在使用的模态 classes 是:

用于保存用户 class 数据的模型 class

class MyData(ndb.Model):
    subject =  ndb.StringProperty()
    teacher = ndb.StringProperty()
    strength = ndb.IntegerProperty()
    date = ndb.DateTimeProperty()

用户模型class

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 模态的结构化 属性 的 属性 上的过滤器查询 MyUser 结果时,即 my_data,它没有给出正确的结果。

我想我查询有误。 这是我的查询函数

根据重复结构进行查询的函数属性

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 的列表。

请帮助我知道我哪里做错了。

谢谢。

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

像这样应该可以解决问题:

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