How to set an ndb keyProperty

纵然是瞬间 提交于 2019-12-22 09:33:45

问题


I'm having some trouble understanding how entities and keys work in Google App Engine NDB.

I have a post entity and a user entity. How do I set the user_key on post to user?

In the interactive console, I have this so far:

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()

I'm just trying to set up some seed data for development. I know this probably isn't the ideal way to set things, but my first question is:

  1. How do I get a key from an entity (the reverse is described in the docs)
  2. How do I set associations in ndb?

回答1:


try:

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



回答2:


Maybe this helps to understand the NDB. I had the same questions with you.

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. Verify that shuffle works in this case, as User.query() returns an iter, not a list. (You can convert it to a list using shuffle( [ x for x in users ] ). Beware, this list could be looong.
  2. NDB has some really wired behavior sometimes, so id recommend you dont store an NDB-Key, but its serialized string, which is also compatible to ext.db: post.user_key = shuffle( [ x for x in users ] ).key.urlsafe()
  3. You could use KeyProperty for associations. If you need a more fine-graned control over your relations, you must implement them yourself. See https://developers.google.com/appengine/docs/python/ndb/properties#structured


来源:https://stackoverflow.com/questions/14192331/how-to-set-an-ndb-keyproperty

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!