我回到AppEngine开发中。 而且我很满意数据存储。
我习惯于“ids”,使用“/ view?id = 322345”这样的链接构建网站,这个ID就是我的留言簿。
但在AppEngine中,我总是看到调用的db.Key.from_path()方法以及“祖先”和“父母”之类的其他东西。
在我的项目中,我有像User-> Phonenumbers之类的简单关系,我想通过GET url检查每个用户,附加类似id的内容。 我应该使用用户模型密钥()还是如何在AppEngine中实现?
目前,如果我想向用户添加电话号码,请写下以下内容:
class JoinHandler(webapp2.RequestHandler):
def get(self):
user_key = self.request.get('rlm')
fon_number = PhoneNumber()
fon_number.country = "deDE"
fon_number.user = db.Key(user_key)
fon_number.put()
self.redirect("/")
答案 0 :(得分:9)
如果您正在使用put
实体时数据存储自动分配的数字ID,则可以使用模型的get_by_id
方法检索实体:
class User(db.Model):
name = db.StringProperty()
# etc.
def AddUser(webapp2.RequestHandler):
def get(self):
newUser = User()
newUser.name = self.request.get('name')
# etc. assign all model properties
newUser.put()
# now, newUser.Key().id() contains the auto-assigned numeric id.
# we can pass this value to our template and get it back via
# a form paramter for subsequent operations.
def ShowUser(webapp2.RequestHandler):
def get(self):
user_to_show_id = self.request.get('id')
user_to_show = User.get_by_id(user_to_show_id)
if user_to_show is not None:
# populate the template parameters with the users's data
# and render the template
else:
# The requested user does not exist, so
# render an error message/page.
现在,如果您还想存储属于给定用户的电话号码实体,您可以将它们存储为其父级是用户实体。这将它们放在用户的实体组中,并且实体组中的实体可以比与父项一起存储时更快地一起查询。
假设任何用户可以拥有与之关联的任何给定数量的Phonenumber实体:
class Phonenumber(db.Model):
number_type = db.StringProperty()
number = db.StringProperty()
我们将向User类添加一个方法:
def AddNumber(self, new_number_type, new_number):
new_number = Phonenumber(parent=self, number_type=new_number_type, number=new_number)
# In this case, self is the User entity, and by saying parent=self, we're putting
# this Phonenumber entity into User's entity group.
new_number.put()
def GetPhoneNumber(self):
# Now, getting all of User's phone numbers is a simple as a query with an
# Ancestor clause:
users_numbers = Phonenumber.all().ancestor(self).fetch(1000)
return users_numbers
显然,这些课程都是天真的,直言不讳,但我希望它们能帮助你理解id和祖先的关系。通常,您不必使用Key()
来手动创建密钥。除非你真的需要,否则不要去那条路。尽管如此,理解Keys如何工作对于真正理解AppEngine是有益的,所以如果您愿意,请深入研究并进行实验。
我认为这是你的两个主要问题,是吗?如果你有其他人,请继续发表评论,我将编辑我的答案。
答案 1 :(得分:2)
至于您关于db.Key.from_path()
会做什么的问题,请查看Key Class docs,您会看到from_path()
的第一个参数是种类您将要检索的数据存储对象。
Args列为:
Key.from_path(kind, id_or_name, parent=None, namespace=None)
在我的一个基本博客应用程序中,我有以下几行:
key = db.Key.from_path('BlogPost', int(post_id), parent=blog_key())
这是在查找BlogPost
类型的对象,其id为post_id
,父级等于blog_key()
方法的返回值。
blog_key()
定义为:
def blog_key(name = 'default'):
return db.Key.from_path('blogs', name)
我会非常诚实地对你说:我仍然没有想出这部分(从udacity cs253逐字复制),但我认为它所建立的是所有{{1}数据存储区中的祖先值。对象。
我只是在GAE工作了几个星期,正在完成cs253课程,所以我真的很感激对此的任何澄清,或者更清楚地解释“正在发生的事情”