如何在Google App Engine中获得我的某个模型的独特价值

时间:2009-07-25 21:22:50

标签: python google-app-engine google-cloud-datastore

我在下面有一个模型,我希望得到所有不同的area值。 SQL等价物是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'])

但这需要我将区域项目从查询中移到另一个列表中,然后针对列表运行set(听起来非常低效),如果我在数据存储区中有一个位于1001位置的不同项目,我就不会看到它因为获取限制为1000。

我想获取数据存储区中所有不同的区域值,将其作为链接转储到屏幕上。

3 个答案:

答案 0 :(得分:7)

数据存储无法在单个查询中为您执行此操作。数据存储区请求始终从索引返回连续的结果块,索引始终由给定类型的所有实体组成,根据指定的顺序排序。由于一个字段具有重复值,因此查询无法跳过项目。

一种选择是重组您的数据。例如,引入表示“区域”的新实体类型。在添加教程时,如果它还不存在,则创建相应的“区域”,如果没有教程保留相同的“区域”,则在删除Tutoral时删除相应的“区域”。如果每个区域都存储了该区域中的教程计数,这可能不会太繁重(尽管保持与事务等一致的事实上会非常繁琐)。我希望实体的密钥可以基于区域字符串本身,这意味着您可以始终进行密钥查找而不是查询来获取区域实体。

另一种选择是使用排队任务或cron作业定期创建所有区域的列表,如果需要,将其累积在多个请求上,并将结果放在数据存储区或memcache中。这当然意味着区域列表有时可能暂时过时(或者如果有不断变化,可能永远不会完全在日期),这可能是您可能接受的,也可能是不可接受的。

最后,如果与教程相比可能只有很少的区域,你可以通过请求第一个教程(按区域排序)动态地执行它,然后请求第一个教程,其面积大于区域的面积。首先,依此类推。但这需要每个不同区域有一个请求,因此不太可能很快。

答案 1 :(得分:1)

DISTINCT关键字已在1.7.4版中引入。

答案 2 :(得分:0)

This has been asked before,结论是使用套装很好。