Google App Engine - 添加索引

时间:2015-08-03 09:18:28

标签: python python-2.7 google-app-engine

我们有一类Google App Engine(在Python中),其中字段is_admin未编入索引。我们希望它现在被编入索引,以便我们可以按角色过滤用户 - 管理员或非管理员(is_admin true或false)。原来的课是这样的:

class DomainUser(db.Expando, ExpandoEntity, SocialIconsEntity):
    """
    User domain DB Model
    """
    domain = db.StringProperty(required=True)
    ...
    is_admin = db.BooleanProperty(default=False, indexed=False)
    ...

我改为:

    class DomainUser(db.Expando, ExpandoEntity, SocialIconsEntity):
    """
    User domain DB Model
    """
    domain = db.StringProperty(required=True)
    ...
    is_admin = db.BooleanProperty(default=False)
    ...

但我在文档中读到,我们必须再次保存每个对象以创建索引。是否可以在不保存所有对象的情况下创建索引?我们按特定域筛选所有用户,然后按is_admin字段筛选(或排序)。我们可以为index.yaml添加索引吗?目前,如果我们按is_admin过滤用户,则会收到空结果。

1 个答案:

答案 0 :(得分:1)

您列出的两个选项几乎就是您所获得的:

  1. 使用索引:在删除indexed=False的情况下重新保存所有实体(可能非常昂贵,但只有在您拥有大量现有DomainUser实体时才有一次)。

  2. 根本不使用索引:仅通过domain属性进行查询并在python中过滤结果(如果每个domain中有大量用户,则每次都可能非常昂贵,具体取决于您运行查询的频率,即:

  3.  all_users = DomainUser.query(DomainUser.domain == 'xxx').fetch()
     admins = [u for u in all_users if u.is_admin]
     users = [u for u in all_users if not u.is_admin]
    

    你需要自己决定哪个选项会更便宜/更快,如果这就是你所追求的。