LA_*_*LA_ 3 google-app-engine jquery-ui google-cloud-datastore
我使用jQuery UI 自动完成小部件.我也有GAE数据存储区:
class Person(db.Model):
# key_name contains person id in format 'lastname-firstname-middlename-counter',
# counter and leading dash are omitted, if counter=0
first_name = db.StringProperty()
last_name = db.StringProperty()
middle_name = db.StringProperty()
Run Code Online (Sandbox Code Playgroud)
当用户可以输入姓氏,名字和/或中间名时,如何在自动填充小部件中搜索此人?
所以,我得到的用户输入字符串为self.request.get('term').我应该如何在我的数据存储区中搜索相同内容(因为我需要查看每个字段,可能还有3个字段的组合值)?如何优化这样的查询?我也不清楚答复格式应该是什么.jQuery doc说:
数据源可以是:
Run Code Online (Sandbox Code Playgroud)an Array with local data a String, specifying a URL a Callback本地数据可以是一个简单的字符串数组,也可以包含数组中每个项目的对象,带有标签或值属性或两者.
这里有一些巧妙的技巧.考虑这个增强模型:
class Person(db.Model):
first_name = db.StringProperty()
last_name = db.StringProperty()
middle_name = db.StringProperty()
names_lower = db.StringListProperty()
Run Code Online (Sandbox Code Playgroud)
您需要将names_lower与真实字段保持同步,例如:
p.names_lower = [p.first_name.lower(), p.last_name.lower(),
p.middle_name.lower()]
Run Code Online (Sandbox Code Playgroud)
您可以使用DerivedProperty更优雅地完成此操作.
现在,您的查询:
term = self.request.get('term').lower()
query = Person.all()
query.filter('names_lower >=', term)
query.filter('names_lower <=', unicode(term) + u"\ufffd")
Run Code Online (Sandbox Code Playgroud)
这给你:
因此,对"smi"的查询将返回任何名称以"smi"开头的人.
将小写名称复制到ListProperty可启用不区分大小写的匹配,并允许我们使用一个查询搜索所有3个字段."\ ufffd"是最高可能的unicode字符,因此它是我们子字符串匹配的上限.如果由于某种原因您想要完全匹配,请过滤掉'names_lower =', term.
编辑:
我应该如何在我的数据存储区中搜索相同内容(因为我需要查看每个字段,可能还有3个字段的组合值)?如何优化这样的查询?
这已经在原始解决方案中得到了解决.通过获取3个字段并将它们复制到单个ListProperty,我们实际上创建了一个单个索引,每个人有多个条目.如果我们有一个名叫Bob J Smith的人,我的索引中会有3个点击:
这消除了在每个字段上运行不同查询的需要.
我也不清楚答复格式应该是什么.
仔细阅读文档.格式化jQuery的输出应该非常简单.您的数据源将是指定URL的字符串,您需要将响应格式化为JSON.