Python 如何设置ndb密钥属性

Python 如何设置ndb密钥属性,python,django,google-app-engine,app-engine-ndb,Python,Django,Google App Engine,App Engine Ndb,我在理解谷歌应用程序引擎NDB中的实体和键是如何工作的方面遇到了一些问题 我有一个post实体和一个user实体。如何将post上的user\u键设置为user 在交互式控制台中,到目前为止,我有以下内容: from google.appengine.ext import ndb from app.lib.posts import Post from app.lib.users import User from random import shuffle users = User.query(

我在理解谷歌应用程序引擎NDB中的实体和键是如何工作的方面遇到了一些问题

我有一个
post
实体和一个
user
实体。如何将
post
上的
user\u键设置为
user

在交互式控制台中,到目前为止,我有以下内容:

from google.appengine.ext import ndb
from app.lib.posts import Post
from app.lib.users import User
from random import shuffle

users = User.query()
posts = Post.query().fetch()

for post in posts:
  post.user_key = shuffle(users)[0]
  post.put()
我只是想为发展建立一些种子数据。我知道这可能不是设定目标的理想方式,但我的第一个问题是:

  • 如何从实体获取密钥(文档中描述了相反的情况)
  • 如何在ndb中设置关联
  • 尝试:

  • 验证shuffle在这种情况下是否有效,因为User.query()返回的是iter,而不是列表。(您可以使用shuffle将其转换为列表([x代表用户中的x])。注意,此列表可能很长
  • NDB有时有一些非常有线的行为,所以我建议您不要存储NDB密钥,而是存储其序列化字符串,该字符串也与ext.db:post.user_Key=shuffle([x代表x在users中]).Key.urlsafe()兼容
  • 您可以使用KeyProperty进行关联。如果您需要对关系进行更精细的授权控制,您必须自己实现它们。 看

  • 也许这有助于理解NDB。我和你有同样的问题

    class Person(ndb.Expando):
        pass
    
    class Favourite(ndb.Expando):       
        pass
    
    class Picture(ndb.Expando):
        pass
    
    person  = Person()
    person.put()
    picture = Picture()
    picture.put()
    fav = Favourite(parent=person.key,
            person=person.key,
            picture=picture.key
            )
    fav.put()
    

    我想我已经尝试过了。但是我可能没有先获取查询就尝试过了。恢复了理智,谢谢。我也应该发布我的类。我正在使用KeyProperty定义用户密钥。但是关联对我来说仍然很奇怪。看看这里。这对我帮助很大
    class Person(ndb.Expando):
        pass
    
    class Favourite(ndb.Expando):       
        pass
    
    class Picture(ndb.Expando):
        pass
    
    person  = Person()
    person.put()
    picture = Picture()
    picture.put()
    fav = Favourite(parent=person.key,
            person=person.key,
            picture=picture.key
            )
    fav.put()