我有以下型号......
class User(ndb.Model):
email = ndb.StringProperty()
username = ndb.StringProperty(indexed=True)
password = ndb.StringProperty()
class Rel(ndb.Model):
user = ndb.KeyProperty(kind=User, indexed=True)
follows = ndb.KeyProperty(kind=User, indexed=True)
blocks = ndb.KeyProperty(kind=User)
我试图制作它,以便用户可以关注或阻止任何其他数量的用户。
使用上述设置,我发现很难执行传统DBMS很容易完成的任务。
作为一个简单的例子,我如何找到所有给定用户的关注者和按用户名排序 - 请记住,当我在Rel上执行查询时,我回到键而不是用户对象
我是以错误的方式解决这个问题吗?
答案 0 :(得分:2)
你必须进行抓取,但你可以更好地设计它,
以下和块字段可以是列表而不仅仅是键 -
follows = ndb.KeyProperty(kind=User, repeated=True)
blocks = ndb.KeyProperty(kind=User, repeated=True)
在此之后,当您需要此用户的以下内容时,您可以获取密钥并执行ndb.get_multi(Keys_list)以获取所需的所有follow / blocks实体。
或强>
更好的方法 -
如果您关心订单并希望分页,则必须单独存储所有后续/块实体, 例如,如果这是关于用户'a'
跟随实体将为每个人提供记录'a'跟随
class FollowEntity(ndb.Model):
user = ndb.KeyProperty(kind=User)
follow = ndb.KeyProperty(kind=User)
follow_username = ndb.StringProperty()
查询即可
假设user
是来自“用户”实体的条目。
query = FollowEntity.query(FollowEntity.user == user.key).order(FollowEntity.follow_username)
如果您使用fetch_page批量显示结果,则可以运行此查询并获取已排序的用户名结果。
也为BlockEntity做同样的事情