Python AppEngine id/key/from_路径非常混乱,我应该使用什么

Python AppEngine id/key/from_路径非常混乱,我应该使用什么,python,google-app-engine,python-2.7,Python,Google App Engine,Python 2.7,我又回到了AppEngine开发中。 我对数据存储很感兴趣 我习惯于使用“id”,通过“/view?id=322345”这样的链接来构建网站,这样我就可以获得带有此id的留言簿条目 但在AppEngine中,我总是看到调用db.Key.from_path()方法和其他类似“祖先”和“父母”的东西 在我的项目中,我有一些简单的关系,比如User->Phonenumbers,我想通过一个附加id的GET url来检查每个用户。 我应该使用User models key()还是在AppEngine中如

我又回到了AppEngine开发中。 我对数据存储很感兴趣

我习惯于使用“id”,通过“/view?id=322345”这样的链接来构建网站,这样我就可以获得带有此id的留言簿条目

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

在我的项目中,我有一些简单的关系,比如User->Phonenumbers,我想通过一个附加id的GET url来检查每个用户。 我应该使用User models key()还是在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("/")

如果您使用的是数据存储在
put
实体时自动分配的数字id,则可以使用模型的
get\u by\u 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()
我们将向用户类添加一个方法:

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()
手动创建键。除非你真的需要,否则不要走那条路。尽管如此,理解键是如何工作的对于真正理解AppEngine是有好处的,所以如果你愿意,就潜入其中并进行实验


我想这是你的两个主要问题,是吗?如果您还有其他人,请继续留言,我将编辑我的答案。

关于
db.Key.from\u path()
的问题,请检查,您将看到
from\u path()
的第一个参数是要检索的数据存储对象的类型

arg如下所示:

Key.from_路径(种类、id或名称,父项=None,命名空间=None)

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

key=db.key.from_path('BlogPost',int(post\u id),parent=blog\u key())

这是在查找类型为
BlogPost
的对象,其id为
post\u id
,父对象等于
blog\u key()
方法的返回值

blog\u key()
定义为:

def blog_key(name = 'default'):
return db.Key.from_path('blogs', name)
我会非常诚实地告诉你:我仍然没有弄清楚这一部分(逐字复制自),但我认为它建立的是所有
BlogPost
对象的数据存储中的祖先值


我只在GAE工作了几周,学习了cs253课程,因此我非常感谢您对此的任何澄清,或者更清楚地解释“发生了什么”

类似于您的问题:您不需要将用户id转换为int吗?如果我不投,它对我不起作用…谢谢!我想知道我是否做错了什么。我是新来的。