我当前的应用程序使用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>
答案 0 :(得分:2)
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的key_name,然后使用friend_list = FriendList.get_by_key_name(str(user.user_id()))
代替查询。你需要一种方法来处理一个FriendList不够的情况,但那些可能很少 - 并且解决起来并不困难(在key_name中添加一个序列号并存储(非索引)计数用户类型上的序列,然后您可以轻松生成key_names)。