Python 编写ndb查询以返回实体键和实体

Python 编写ndb查询以返回实体键和实体,python,flask,google-cloud-datastore,app-engine-ndb,Python,Flask,Google Cloud Datastore,App Engine Ndb,我有一个ndb用户模型: class User(ndb.Model): active = ndb.BooleanProperty(default=True,required=True) email= ndb.StringProperty(required=True) 我调用它来检索所有用户的JSON文件 @app.route('/get_users') @login_required def get_user_data(): users = json.dumps([u.

我有一个ndb用户模型:

class User(ndb.Model):
    active = ndb.BooleanProperty(default=True,required=True)
    email= ndb.StringProperty(required=True)
我调用它来检索所有用户的JSON文件

@app.route('/get_users')
@login_required
def get_user_data():
    users = json.dumps([u.to_dict() for u in User.query().fetch()])
    return users
输出返回如下所示:

[{"email": "user@email.com"},{"email": "user2@email.com"}....]
[{"email": "user@email.com", "id": xxxxxx},{"email": "user2@email.com", "id": xxxxxx}....]
users = json.dumps([u.to_dict(include_key=True) for u in User.query().fetch()])
我希望将每个用户的ID传递到对象中,以便以后可以使用它查询单个用户。理想情况下,我希望输出如下所示:

[{"email": "user@email.com"},{"email": "user2@email.com"}....]
[{"email": "user@email.com", "id": xxxxxx},{"email": "user2@email.com", "id": xxxxxx}....]
users = json.dumps([u.to_dict(include_key=True) for u in User.query().fetch()])
我尝试将以下声明添加到我的模型类中: id=ndb.KeyProperty()

但是我得到的是null值,而不是从数据存储实体中检索实际的ID值


如何提取所有用户的密钥并将其添加到返回的对象中?

您可以扩展
User。要指定
以选择性地包含密钥,请执行以下操作:

def to_dict(self, include=None, exclude=None, include_key=False):
    d = super().to_dict(include=include, exclude=exclude)
    if include_key:
        d['key'] = self.key.urlsafe().decode() # or some other JSON-friendly version of the key
    return d
然后更改代码,如下所示:

[{"email": "user@email.com"},{"email": "user2@email.com"}....]
[{"email": "user@email.com", "id": xxxxxx},{"email": "user2@email.com", "id": xxxxxx}....]
users = json.dumps([u.to_dict(include_key=True) for u in User.query().fetch()])
密钥可以从其urlsafe密钥表示形式中重新构造,如下所示():


这是否意味着我需要在我的用户模型上添加to_dict函数?如何更改我的“users=json.dumps([u.to_dict(),代表User.query().fetch()])以反映这一点?是的,您可以将该函数添加到模型的代码中。如果您希望输出包含密钥,请将
传递给_dict(include_key=True)
。这样做:)将返回密钥的一个版本:“key”:“ag1lc3nlbmnllw9jdhchilegvdagvjaxiagidot9oncgw”},与数据存储中显示的不同,但我想在查询检索实体之前需要对其进行解码。是否可能['key']=self.key.urlsafe().decode()#或者其他一些JSON友好版本的密钥以不同的顺序返回了密钥?当我按密钥查询时,附加到用户1的JSON文件中的密钥会返回用户2。来自用户2的密钥根本不会带来任何用户。这不太可能,因为
self
指的是单个
用户
实例。如果您能够可靠地重新编译对于这种行为,最好提出一个问题,然后再问另一个问题——我认为在这里的评论中这是无法解决的。