4

AppEngineの開発に戻りました。そして、私はDatastorageにかなり電話を切っています。

私は「ids」に慣れています。「/view?id = 322345」のようなリンクでWebサイトを構築すると、このidvoilàのGuestBookエントリが表示されます。

しかし、AppEngineでは、db.Key.from_path()メソッドが呼び出され、「祖先」や「親」などの他のものが常に表示されます。

私のプロジェクトでは、User-> Phonenumbersのような単純な関係があり、IDのようなものを追加するGETURLを介して各ユーザーを検査したいと思います。ユーザーモデルkey()を使用する必要がありますか、それとも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("/")
4

2 に答える 2

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.

ここで、特定のユーザーに属する電話番号エンティティも格納する場合は、親が 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つの主な質問だったと思いますよね?他の人がいる場合は、コメントを残してください。回答を編集します。

于 2012-04-15T17:02:23.790 に答える
2

何をするかについての質問に関してdb.Key.from_path()は、キークラスのドキュメントを確認してください。最初の引数が、取得しようとしているデータストア オブジェクトfrom_path()種類であることがわかります。

引数は次のようにリストされます。

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

私の基本的なブログ アプリの 1 つに、次の行があります。

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 cs253BlogPostから逐語的にコピーされています)が、それが確立しているのは、すべてのオブジェクトのデータストアの先祖の値だと思います。

私は、cs253 コースを通じて GAE を数週間しか使用していないので、これについての説明、または「何が起こっているのか」をより明確に説明していただければ幸いです。

于 2013-10-23T04:35:40.297 に答える