与Google App Engine上的NDB有很多很多关系

时间:2016-05-22 05:46:47

标签: python google-app-engine google-cloud-datastore app-engine-ndb webapp2

我有以下型号......

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上执行查询时,我回到键而不是用户对象

我是以错误的方式解决这个问题吗?

1 个答案:

答案 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做同样的事情