エンティティを取得するときにデータストアによって自動的に割り当てられる数値 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.
ここで、特定のユーザーに属する電話番号エンティティも格納する場合は、親が User エンティティになるように格納します。これにより、それらはユーザーのエンティティ グループに配置され、エンティティ グループに含まれるエンティティは、親と共に格納されている場合よりも迅速にクエリを実行できます。
User は、任意の数の 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()
キーを手動で作成するために を使用する必要はまったくありません。本当に必要でない限り、そのルートに行かないでください。それでも、キーがどのように機能するかを理解することは、AppEngine を本当に理解するのに役立ちます。
それがあなたの2つの主な質問だったと思いますよね?他の人がいる場合は、コメントを残してください。回答を編集します。