我在下面有一个模型,我想获得所有不同的area值。SQL等效为select distinct area from tutorials
area
select distinct area from tutorials
class Tutorials(db.Model): path = db.StringProperty() area = db.StringProperty() sub_area = db.StringProperty() title = db.StringProperty() content = db.BlobProperty() rating = db.RatingProperty() publishedDate = db.DateTimeProperty() published = db.BooleanProperty()
我知道在Python中我可以做到
a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com'] b = set(a) b >>> set(['livejournal.com', 'google.com', 'stackoverflow.com'])
但这需要我将区域项目从查询中移出到另一个列表中,然后针对该列表运行集合(听起来效率很低),如果我在数据存储区中的位置1001有一个不同的项目,则由于提取限制为1000。
我想获取数据存储区中area的所有不同值,以将其作为链接转储到屏幕上。
数据存储区无法在单个查询中为您执行此操作。数据存储区请求始终从索引返回连续的结果块,并且索引始终由给定类型的所有实体组成,并根据指定的顺序进行排序。查询无法仅由于一个字段具有重复值就跳过项目。
一种选择是重组数据。例如,引入表示“区域”的新实体类型。添加教程时,如果不存在相应的“区域”,则创建相应的“区域”;如果删除教程,则如果没有与该“区域”相同的教程,则删除相应的“区域”。如果每个区域在该区域都存储了一定数量的Tutorials,则可能不会太繁琐(尽管实际上使事务与事务等保持一致)。我希望实体的键可以基于区域字符串本身,这意味着您始终可以进行键查找而不是查询来获取区域实体。
另一种选择是使用排队的任务或cron作业来定期创建所有区域的列表,如果需要,可以在多个请求上累积该列表,然后将结果放入数据存储区或内存缓存中。当然,这意味着区域列表有时可能会暂时过时(或者,如果不断变化,则可能永远不会完全过时),您可能会接受也可能无法接受。
最后,如果与教程相比可能只有很少的区域,则可以通过请求第一个教程(按区域排序),然后请求第一个教程的面积大于第一个教程的面积,来即时进行操作。以此类推。但这在每个不同的区域都需要一个请求,因此不太可能很快。