【问题标题】:How to set an ndb keyProperty如何设置 ndb keyProperty
【发布时间】:2013-01-07 08:34:24
【问题描述】:

我无法理解实体和键在 Google App Engine NDB 中的工作方式。

我有一个post 实体和一个user 实体。如何将post 上的user_key 设置为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()

我只是想设置一些用于开发的种子数据。我知道这可能不是设置事物的理想方式,但我的第一个问题是:

  1. 如何从实体中获取密钥(文档中描述了相反的内容)
  2. 如何在 ndb 中设置关联?

【问题讨论】:

标签: python django google-app-engine app-engine-ndb


【解决方案1】:

尝试:

post.user_key = shuffle(users)[0].key

【讨论】:

  • 我以为我试过了。但我可能在没有先获取查询的情况下尝试了它。恢复理智,谢谢。
【解决方案2】:

也许这有助于理解 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()

【讨论】:

    【解决方案3】:
    1. 验证 shuffle 在这种情况下是否有效,因为 User.query() 返回的是一个迭代器,而不是一个列表。 (您可以使用 shuffle( [ x for x in users ] ) 将其转换为列表。请注意,此列表可能会很长。
    2. NDB 有时会有一些非常有线的行为,所以 id 建议你不要存储 NDB-Key,但它的序列化字符串也与 ext.db 兼容: post.user_key = shuffle( [ x for x in users ] ) .key.urlsafe()
    3. 您可以使用 KeyProperty 进行关联。如果您需要对关系进行更精细的控制,则必须自己实现它们。 见https://developers.google.com/appengine/docs/python/ndb/properties#structured

    【讨论】:

    • 我也应该发布我的课程。我am 使用 KeyProperty 来定义 user_key。不过,在我看来,关联仍然很时髦。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多