2012-04-15 26 views
4

我回到了AppEngine开发中。 我很喜欢Datastorage。AppEngine id/key/from_path相当混乱我应该怎么使用

我习惯了“IDS”,建立网站,如“/视图?ID = 322345”链接让我这个ID瞧的留言条目。

但在AppEngine中,我总是看到调用的db.Key.from_path()方法以及其他诸如“祖先”和“父母”之类的东西。

在我的项目中,我有像User-> Phonenumbers这样的简单关系,并且我想通过一个GET url来检查每个用户,并在其中添加类似id的内容。 我应该使用用户模型密钥()吗?或者如何在AppEngine中实现?

目前,如果我想也就是一个PhoneNumber添加到我写了下面的用户:

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("/") 
+1

类似于你的问题:http://stackoverflow.com/questions/10156129/what-should-i-store-as-my-index-in-client-code – alex 2012-04-15 16:44:38

回答

9

如果您使用的是数字ID由数据存储区自动分配,当你put一个实体,就可以然后用模型的方法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 

显然,这些类天真无邪,直截了当,但我希望他们能帮助你理解身份证和祖先的关系。通常情况下,您不必使用Key()手动创建密钥。除非你真的需要,否则不要走这条路。然而,如何理解键的作用是有利于真正理解AppEngine上,所以潜水和实验,如果你喜欢它的感觉。

我觉得那些是你的两个主要问题,是吗?如果你有其他人,请继续留言,我会编辑我的答案。

+1

你不需要将user_to_show_id投入int吗?它不适合我,如果我不施放它...... – 2013-09-16 04:34:59

+0

很可能是真的,Fabien。感谢您指出了这一点。 – 2013-09-16 15:48:10

+0

谢谢!我想知道我是否做错了什么。我是新来的。 – 2013-09-16 16:50:58

2

至于你什么db.Key.from_path()会做题,检查Key Class docs,你会看到的第一个参数是from_path()数据存储对象的那种你会被检索。

参数数量被列出象这样:

Key.from_path(kind, id_or_name, parent=None, namespace=None)

在我的基本的博客的应用程序之一,我有以下行:

key = db.Key.from_path('BlogPost', int(post_id), parent=blog_key())

这是寻找BlogPost类型的对象,随着post_id的ID,并等于blog_key()方法的返回值的父。

blog_key()被定义为:

def blog_key(name = 'default'): 
return db.Key.from_path('blogs', name) 

我会跟你坦白说:我还没有想通了这部分未到(udacity cs253逐字复制),但我认为它的建立是祖先值在所有BlogPost对象的数据存储区中。

我只用GAE工作了几个星期,通过cs253过程中工作,所以我会很感激有这方面的澄清,或更清楚地解释说,“发生了什么”