2012-04-15 8 views
4

私はAppEngine開発に戻ります。 そして私はDatastorageでかなりハングアップしています。AppEngineのid/key/from_pathは、私が何を使うべきかをかなり混乱させます。

私は "ids"に慣れています。 "/ view?id = 322345"のようなリンクを含むウェブサイトを構築すると、このidvoilàのGuestBookエントリが私に届きます。

しかしAppEngineでは、db.Key.from_path()メソッドと、「Ancestors」や「parents」のようなものが常に表示されます。

私のプロジェクトでは、User-> Phonenumbersのような単純な関係があり、GET URLを介してIDのようなものを追加して各ユーザーを検査したいと考えています。 ユーザモデルのキー()を使用するか、AppEngineのこれはどのように達成する必要がありますか?あなたがputエンティティは、することができ、自動的にデータストアによって割り当てられた数値IDを使用している場合

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

答えて

9

:現在、私は次のように記述ユーザーにPhoneNumberのすなわち追加したい場合は

その後、モデルの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エンティティであることを保存します。これにより、ユーザのエンティティグループに格納され、エンティティグループ内にあるエンティティは、親と一緒に格納されている場合よりも迅速に照会できます。

のすべてのユーザがそれに関連付けられた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()を使用する必要はありません。あなたが本当に必要な場合を除き、そのルートには行かないでください。それでも、Keysがどのように機能するかを理解することは、AppEngineを本当に理解する上で役に立ちます。

私はそれらがあなたの2つの主な質問だったと思いますか?あなたが他人を持っている場合は、コメントを残してください。私は自分の答えを編集します。

+1

intにuser_to_show_idをキャストする必要はありませんか?私がそれをキャストしなければ、それは私のためには機能しません... –

+0

非常におそらく真、ファビアン。それを指摘してくれてありがとう。 –

+0

ありがとう!私は何か間違っているのか疑問に思いました。私はこれに新しいです。 –

2

は限りdb.Key.from_path()が何をするかについてのご質問など、Key Class docsチェックして、あなたはfrom_path()への最初の引数は、あなたが取得することになるだろうデータストアオブジェクトの種類であることがわかります。

Argsのは、次のような記載されています:

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

はこのタイプBlogPostのオブジェクトを探しています:

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

が私の基本的なブログのアプリの一つで、私は次の行を持っています、idはpost_id、親は戻り値に等しいblog_key()メソッドです。

blog_key()は次のように定義されています

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

私はあなたと完全に正直になるだろう:私はまだ(udacity cs253からそのままコピー)この部分を考え出したていないが、私は何が確立していますが、先祖値だと思いますすべてのBlogPostオブジェクトのデータストアにあります。

私だけcs253コースを通じて作業、数週間のためにGAEで働いてきたので、私は本当にこの上の任意の明確化を認める、またはより明確に「何が起こっているか」、あなたの質問に似

関連する問題