【问题标题】:Optimized solution for selecting one item from array in PythonPython中从数组中选择一项的优化解决方案
【发布时间】:2017-11-09 13:05:58
【问题描述】:

我正在使用带有 Python 和 Jinja2 模板引擎的 Google App Engine 免费层。

我的任务是对所有 5000 个项目进行投票“是”或“否”。为此,我在索引页面上使用以下查询。

{% extends "base.html" %}
{% block content %}
{% for item in items if not item.voted %}
//HTML goes here to display the item
{% break %}
{% endfor %}
{% endblock %}

我想打破循环,因为我想随时在索引页面上显示一个项目。该项目可以随机选择,但不得投票。这是一个非常未经优化/懒惰的解决方案,在本地工作得很好,但在应用引擎服务器上,这是一项昂贵的操作。在对一些项目进行投票后,我收到以下错误:

OverQuotaError: The API call datastore_v3.RunQuery() required more quota than is available.

有人可以提出更好的解决方案吗?我在使用 jinja2 模板引擎方面的知识非常有限,所以我找不到便宜的解决方案。

【问题讨论】:

    标签: python google-app-engine jinja2


    【解决方案1】:

    有多种方法可以做到这一点。

    1. 为您的实体添加一个“随机”属性,然后查询 1 个项目(使用 limit=1),其中“RandomProp > randomValue”。这与 Jinja2 无关(因为 Jinja 只是一个模板引擎),应该在您的 Python 代码中完成并由 3 个部分组成:修改模型以添加新道具,保存实体时分配一个随机值对于新道具,当想要显示数据时,对新属性进行过滤查询,其属性大于某个(另一个)随机值。

    2. 在某处保存实体 ID 列表并随机选择一个并通过密钥从数据库中获取。

    【讨论】:

    • 您能否详细说明您的第一个选项?我认为它就像一个计数器,下次我会选择下一个大于计数器的项目,但我不确定在 jinja2 中我该怎么做。
    • Jinja2 是一个模板引擎,我所说的代码在你的“控制器”之前,由 3 部分组成: 1 - 模型定义,添加新道具。 2 - 将实体保存到数据库时分配给新的道具随机值。 3.当想要显示数据时,对新属性进行过滤查询,属性大于某个(另一个)随机值。
    • 我的猜测是(我可能是错的):当大多数项目被投票时,这不会在后期返回空项目。如何选择“一些(另一个)随机值”和“随机属性”值?
    • 我不知道您的整个逻辑,但您需要了解模板不适用于业务逻辑,因此您的问题与 Jinja2 完全无关。我猜你最好的选择是#2 - 保留 ID 列表并删除投票的项目。或者可以使用 AJAX。我们不能在这里教你如何设计解决方案。
    • 其实可以做query.filter(Entity.random > random and Entity.voted == False)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2017-07-05
    相关资源
    最近更新 更多