AppEngine id/key/from_path让我很困惑

Jul*_*s F 4 python google-app-engine python-2.7

我重新进入AppEngine开发.而且我很满意数据存储.

我习惯于"ids",用"/ view?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("/")
Run Code Online (Sandbox Code Playgroud)

Ada*_*and 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.
Run Code Online (Sandbox Code Playgroud)

现在,如果您还想存储属于给定用户的电话号码实体,则可以将它们存储为其父级是用户实体.这将它们放在用户的实体组中,并且与父项一起存储时,可以更快地一起查询实体组中的实体.

假设任何用户可以拥有与之关联的任何给定数量的Phonenumber实体:

class Phonenumber(db.Model):
    number_type = db.StringProperty()
    number = db.StringProperty()
Run Code Online (Sandbox Code Playgroud)

我们将向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
Run Code Online (Sandbox Code Playgroud)

显然,这些课程是天真的,直言不讳,但我希望他们能帮助你理解id和祖先的关系.通常,您根本不必使用Key()手动创建密钥.除非你真的需要,否则不要去那条路.仍然,了解Keys如何工作对于真正理解AppEngine是有益的,所以如果您愿意,请深入研究并进行实验.

我认为这是你的两个主要问题,是吗?如果你有其他人,请继续发表评论,我会编辑我的答案.