SDK Console显示内容,App获取空列表

时间:2011-02-04 11:11:41

标签: database google-app-engine

我当前的应用程序使用db.ListProperty(db.Key)表示朋友列表的多对多关系。

我们有以下方案:

# 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)

一个处理用户友情列表的处理程序,处理它并显示它:

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')

我使用FriendList.friends中的两个db.Key()列表条目填充了一个测试好友列表。 s.c. SDK控制台(> Interactive Datastorageviewer)向我展示了这些项目:

key1,key2

但是如果我通过它的键调用这个实体FriendList     打印frlst.friends     输出:[] 处理程序中的问题相同。 我没有得到任何可以使用的数据。 但数据存在。

修正: 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结果列表,而不是我想要的“一个”,我必须做的就是把朋友的密钥列表放到User.get()中,然后我就拥有了所有必要的数据。 / p>

1 个答案:

答案 0 :(得分:2)

friend_list = FriendList(owner=usr_key)不是query,它正在创建一个新的FriendList实例。

你想:friend_lists = FriendList.all().filter('owner', usr_key).fetch(10)

其他评论:

  1. 用于查询的用户的两个方法应该是类方法:

    @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. 您是否考虑将user's idget_by_key_name()一起使用?它会比查询更快。

  3. 还可以使用用户的id作为friend-list的key_name,然后使用friend_list = FriendList.get_by_key_name(str(user.user_id()))代替查询。你需要一种方法来处理一个FriendList不够的情况,但那些可能很少 - 并且解决起来并不困难(在key_name中添加一个序列号并存储(非索引)计数用户类型上的序列,然后您可以轻松生成key_names)。