2011-02-04 8 views
2

私の現在のアプリケーションではフレンドリストの多くの関係にdb.ListProperty(db.Key)が使用されています。SDKコンソールにコンテンツが表示され、空のリストが取り出されます

私たちは、次のスキームがあります。

# previous models 
class User(db.Model): 
    name = db.StringProperty() 
    nickname = db.StringProperty() 
    join_date = db.DateProperty(auto_now_add=True) 
    party = db.ReferenceProperty(PartyEntry, collection_name='participants') 
    def by_name(self, string): 
     return self.gql("WHERE name = :name", name=string).get() 
    def key_by_name(self, string): 
     return self.by_name(string).key() 

class FriendList(db.Model): 
    owner = db.ReferenceProperty(User) 
    friends = db.ListProperty(db.Key) 

、ユーザーがfriendlistフェッチハンドラ、それを処理し、それを表示します。

class Profile_FriendList(WebBase): 
    def get(self): 
     user = self._auth() 
     if user: 
      usr_key = User().key_by_name(user.nickname()) 
      friend_list = friend_lists = FriendList.all().filter('owner', usr_key).fetch(10) 
      self.renderskeleton({ 'friendlist': friend_list } ,'friends.html') 

私は2つのdb.Key(とテストfriendlistを埋め)FriendList.friendsのエントリをリストします。 s.c. SDKコンソール(>インタラクティブDatastorageviewerは)私にこれらのアイテムをdiplays:

key1,key2 

しかし、私はそのキーと 印刷frlst.friends 出力することによって、このエンティティFriendListを呼び出す場合:ハンドラで[] 同じ問題。 私は仕事ができるデータはありません。 しかし、データが存在します。

Fixed: FriendListの問題は、呼ばれたfriendlistオブジェクトがクエリではなく、新しいFriendList()オブジェクトであったことです。 コードを更新しました。固定

:完全な質問が

usr_key = User().key_by_name(user.nickname()) 
logging.info(user.nickname()) 
logging.info(usr_key) 
friend_list = FriendList().all().filter("owner", usr_key).fetch(20) 
logging.info(friend_list) 
logging.info(friend_list[0].friends) 
friends = User.get(friend_list[0].friends) 
logging.info(friends) 
self.renderskeleton({ 'friends': friends } , 'friends.html') 

を解決し、私はGqlQueryのリストを選択した結果の代わりに「1」は、私が欲しい、私はそこからしなければならなかったことは、単純に友人のキーのリストを入れていましたUser.get()とvoilà私は必要なすべてのデータを持っていました。

答えて

2

friend_list = FriendList(owner=usr_key)queryではないため、FriendListの新しいインスタンスを作成しています。

あなたがしたい:friend_lists = FriendList.all().filter('owner', usr_key).fetch(10)

その他のコメント:

  1. ユーザー上の2つの方法あなたのクエリに使用しては本当にクラスメソッドでなければなりません:

    @classmethod 
    def by_name(cls, string): 
        return cls.gql("WHERE name = :name", name=string).get() 
    
    @classmethod 
    def key_by_name(cls, string): 
        return cls.by_name(string).key() 
    
    # to call: 
    user = User.key_by_name('their name') 
    
  2. あなたはget_by_key_name()user's idを使用して考えがありますか?クエリより高速です。

  3. フレンドリストのkey_nameとしてユーザーのIDを使用すると、クエリの代わりにfriend_list = FriendList.get_by_key_name(str(user.user_id()))を実行することもできます。 FriendListの1つでは不十分なケースを処理する方法が必要ですが、それはおそらくまれです。解決するのは難しいことではありません(シーケンス番号をkey_nameに追加し、インデックスなしの数を格納します)。ユーザ種別のシーケンスを作成すると、key_namesを簡単に生成できます)。

    ません上記読み
+0

:.key_by_nameは()まだ名前:) –

+0

により、ユーザーのキーを取得するユーザー()メソッドで、ユーザーオブジェクトにはアクセスできません:( –

+0

daemonfire300 @、うん、私はそれを逃しました;) Userエンティティの名前フィールドに 'user.nickname()'の値が入力されていますか? –

関連する問題