【问题标题】:How to get the distinct value of one of my models in Google App Engine如何在 Google App Engine 中获得我的模型之一的独特价值
【发布时间】:2009-07-25 21:22:49
【问题描述】:

我有一个模型,如下所示,我想获得所有不同的 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'])

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的。我个人会删除“据我所知”位。 :)
    • 感谢您的回答。我想我可能会做重组的想法。我也希望有一些晦涩难懂的方法可以做到这一点
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      This has been asked before,结论是使用集合就可以了。

      【讨论】:

      • 问题是如何使用 Python 过滤结果。这里的问题想说明有 1001 个或更多教程的情况,因此单个查询无法返回它们。
      猜你喜欢
      • 2022-01-11
      • 2021-01-21
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2012-01-23
      • 2010-10-19
      • 1970-01-01
      • 2015-12-13
      相关资源
      最近更新 更多