Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在结构化属性上使用过滤器的NDB查询是否也重复?_Python_Google App Engine_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

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

Python 在结构化属性上使用过滤器的NDB查询是否也重复?,python,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,我正在创建一个示例应用程序,该应用程序存储用户详细信息及其类信息 使用的模态类别包括: 用于保存用户类数据的模型类 用户模型类 我能够成功地将数据存储到数据存储中,还可以使用一些基于电子邮件id和用户名的过滤器对MyUser实体进行简单查询 但是,当我试图从MyUser模式的结构化属性(即my_数据)中使用filter对属性查询MyUser结果时,它不会给出正确的结果 我想我问错了。 这是我的查询函数 基于重复结构属性进行查询的函数 我想获取具有重复结构化属性(my_数据)的实体,该实体应该是一

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

使用的模态类别包括:

用于保存用户类数据的模型类 用户模型类 我能够成功地将数据存储到数据存储中,还可以使用一些基于电子邮件id和用户名的过滤器对MyUser实体进行简单查询

但是,当我试图从MyUser模式的结构化属性(即my_数据)中使用filter对属性查询MyUser结果时,它不会给出正确的结果

我想我问错了。 这是我的查询函数

基于重复结构属性进行查询的函数 我想获取具有重复结构化属性(my_数据)的实体,该实体应该是一个强度大于30的列表

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

谢谢。

对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

查询重复的结构化属性是在您这样做的同时完成的,所以看起来还可以。。。你期望看到什么?你实际上得到了什么?(顺便说一句:您不需要使用ndb。当您查询电子邮件id和我的数据时。强度:并且是默认值)实际上过滤器工作不正常。对于那个特定的MyUser实体,我已经添加了MyData类型的多个结构化属性,正如您在modals中看到的那样。我只需要那些类强度大于30的MyData属性的最终数据。但是当我进行查询时,不会进行任何筛选,我会保存所有MyData属性。第2行中的查询将返回所有
MyUser
对象,这些对象的
MyData
属性中至少有一个
my_
,且
strength>30
(您正在查询
MyUser
)。我现在添加了一个答案和完整的代码,以实现您想要的
class MyUser(ndb.Model):
    user_name = ndb.StringProperty()
    email_id = ndb.StringProperty()
    my_data = ndb.StructuredProperty(MyData, repeated = True)
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
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