如何使用Google App Engine实现像'包含'过滤查询的Django?

时间:2010-07-22 12:40:26

标签: python google-app-engine

是否有某种方法可以使用Google App Engine实现包含或icontains过滤器等Django?我正在使用app引擎补丁。

我之前使用了以下查询来匹配字符串的开头,但现在要求是在数据存储区中找到字符串模式。

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

基本上,要求是实现搜索功能,其中包含搜索字符串的所有字符串。

请建议。

提前致谢。

4 个答案:

答案 0 :(得分:4)

您需要做的是创建一个字符串列表属性,在该列表中使用不同的字符串排列和查询。

查看appengine.ext.search.SearchableModel以获取示例实现。 您还可以查看nonrel-search

答案 1 :(得分:0)

不,数据存储区中实际上不可能进行真正的子字符串搜索。

你能做的最好的事情就是添加一个关键字索引并从你的问题中做出“开始于”类型查询,但即便如此,对于像“foo bar baz”这样的实体,你可以在搜索“ba”时进行匹配“但不是”ar b“。

对于BigQuery来说,这听起来不错,现在正在预览中,有一个等待列表可供访问。

答案 2 :(得分: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的参数列表,然后获取整个结果并过滤它以仅保存通过所有条件的结果。

答案 3 :(得分:0)

querySet = Entity.objects.all()
ids = []
for i,obj in enumerate(querySet.iterator()):
    str_to_search =obj.name
    if str_to_search.find('blahblah') != -1:
        ids.append(obj.id)
querySet = querySet.filter(id__in = ids)