我当前的应用程序使用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 id与
get_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/