在结构化属性上使用过滤器的NDB查询也会重复?

时间:2015-03-20 13:08:59

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

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

正在使用的模态类是:

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

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.

请帮助我知道我做错了什么。

感谢。

1 个答案:

答案 0 :(得分:2)

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