如何在Google App Engine中实现类似Django的'contains'过滤查询?

4 投票
4 回答
2485 浏览
提问于 2025-04-16 01:41

有没有办法在Google App Engine上实现像Django中的contains或icontains这样的过滤器呢?我正在使用app engine的补丁。

我之前用过下面的查询来匹配字符串的开头,但现在的需求是要在Datastore中查找字符串模式。

Employee.all().filter('name >=',value).filter('name <',unicode(value) + u'\ufffd')

基本上,需求是实现一个搜索功能,结果是所有包含搜索字符串的字符串。

请给点建议。

提前谢谢你。

4 个回答

0

最近我遇到了同样的问题,于是我自己做了一个模型管理器,并重写了过滤功能,让它也能理解 __contains。我猜你是在用Django。

class UserFeedManager(models.Manager):    
    def filter(self, *args, **kwargs):
        keywordargs = {}
        for (arg, val) in kwargs.items():
            if '__contains' in arg:
                contains.append((arg.split('__')[0], val))
            else:
                keywordargs[arg] = val

        result = []
        if len(contains) > 0:
            for entry in super(UserFeedManager, self).filter(*args, **keywordargs):
                if all(map(lambda (attr, val): val in entry.__getattribute__(attr),
                           contains)):
                    result.append(entry)
        else:
            result = super(UserFeedManager, self).filter(*args, **keywordargs)

        return result

基本上,它会先列出所有带有 __contains 的参数,然后获取所有结果,再把这些结果过滤,只保留符合所有条件的部分。

0

不,真正的子字符串搜索在这个数据存储中是做不到的。

你能做的最好的办法是添加一个关键词索引,然后根据你的问题进行那种“以...开头”的查询。不过,即便如此,对于像“foo bar baz”这样的内容,你可以在搜索“ba”时找到匹配,但搜索“ar b”就找不到了。

这听起来非常适合使用BigQuery,目前它还在预览阶段,需要排队才能获得访问权限。

4

你需要做的是创建一个字符串列表属性,里面包含不同的字符串组合,然后在这个列表上进行查询。

可以看看 appengine.ext.search.SearchableModel,里面有一个示例实现。你也可以查看一下 nonrel-search

撰写回答