我当前的应用程序使用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()列表条目填充了一个测试friendlist。
s.c.sdk控制台(>交互式数据存储查看器)显示这些项:
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()中,然后我就拥有了所有必要的数据。

最佳答案

friend_list = FriendList(owner=usr_key)不是query,它正在创建friendlist的新实例。
你想要:friend_lists = FriendList.all().filter('owner', usr_key).fetch(10)
其他评论:
用于查询的用户上的两个方法实际上应该是类方法:

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

您是否考虑过将user's idget_by_key_name()一起使用?这将比查询更快。
还可以使用用户id作为好友列表的键名,而不是查询friend_list = FriendList.get_by_key_name(str(user.user_id()))。您需要一种方法来处理这样的情况:一个friendlist是不够的,但是这些可能很少见——而且解决起来也不是那么困难(在key_name中添加一个序列号,并在user kind中存储一个(非索引的)序列计数,然后就可以轻松地生成key_names)。

关于database - SDK控制台显示内容,App获取空列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4897340/

10-10 19:37