使用过滤器在数据存储区中查询多对多

时间:2014-01-09 10:04:02

标签: python database google-app-engine many-to-many google-cloud-datastore

我有2个实体模型

class User(ndb.Model):
    username = ndb.StringProperty()
    # other properties

class Item(ndb.Model):
    type = ndb.StringProperty()
    # other properties

UserItem

之间存在多对多的关系
class UserItem(ndb.Model):
    user = ndb.KeyProperty(kind=User)
    item = ndb.KeyProperty(kind=Item)
    # other properties

如何使用UserItem过滤器查询Item.type。像select * from UserItem where UserItem.user = user_key and UserItem.item.type = item_type这样的东西。

我知道我可以用StructuredProperty来做,但实体限制为1mb。如果模型不可能,我应该如何建模关系以获得数据存储区中过滤器工作的查询?

由于

1 个答案:

答案 0 :(得分:2)

不能这样做,你不应该尝试。数据存储区不是关系数据库,不应该用作一个数据存储区。

您应该考虑在其中一个实体中存储密钥列表,而不是使用链接UserItem表。例如,您可以向用户添加字段:

items = ndb.KeyProperty(kind=Item, repeated=True)

然后使用您的User对象,按键获取项目并过滤掉您需要的项目:

user_items = ndb.get_multi(my_user.items)
relevant_items = [item for item in user_items if item.type == my_type]

确切的结构将取决于您的用例,但关键是不要像在SQL中那样考虑传统关系。