【问题标题】:How to display JSON task results stored via django-celery-results framework in django template?如何在 django 模板中显示通过 django-celery-results 框架存储的 JSON 任务结果?
【发布时间】:2018-08-17 09:32:31
【问题描述】:

在我的项目中,我使用django-celery-results framework 来访问 celery 任务结果。该框架将任务结果存储为 JSON 格式。结果之一如下图;

"{\"runs\": [{\"run_number\": 1, \"run_date\": \"2018-08-17 10:13:53.488079\", \"cycle_number\": 0, \"global_best\": {\"number_of_fitness_cases\": null, \"functions\": [{\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}], \"n_features\": 1, \"constants\": [{\"value\": 0.1}, {\"value\": 0.2}, {\"value\": 0.3}, {\"value\": 0.4}, {\"value\": 0.5}, {\"value\": 0.6}, {\"value\": 0.7}, {\"value\": 0.8}, {\"value\": 0.9}, {\"value\": -0.1}, {\"value\": -0.2}, {\"value\": -0.3}, {\"value\": -0.4}, {\"value\": -0.5}, {\"value\": -0.6}, {\"value\": -0.7}, {\"value\": -0.8}, {\"value\": -0.9}], \"terminals\": [{\"value\": 0.1}, {\"value\": 0.2}, {\"value\": 0.3}, {\"value\": 0.4}, {\"value\": 0.5}, {\"value\": 0.6}, {\"value\": 0.7}, {\"value\": 0.8}, {\"value\": 0.9}, {\"value\": -0.1}, {\"value\": -0.2}, {\"value\": -0.3}, {\"value\": -0.4}, {\"value\": -0.5}, {\"value\": -0.6}, {\"value\": -0.7}, {\"value\": -0.8}, {\"value\": -0.9}, 0], \"full_set\": [{\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"value\": 0.1}, {\"value\": 0.2}, {\"value\": 0.3}, {\"value\": 0.4}, {\"value\": 0.5}, {\"value\": 0.6}, {\"value\": 0.7}, {\"value\": 0.8}, {\"value\": 0.9}, {\"value\": -0.1}, {\"value\": -0.2}, {\"value\": -0.3}, {\"value\": -0.4}, {\"value\": -0.5}, {\"value\": -0.6}, {\"value\": -0.7}, {\"value\": -0.8}, {\"value\": -0.9}, 0], \"random_state\": \"<mtrand.RandomState object at 0x7efc35c67240>\", \"max_depth\": 5, \"method\": \"full\", \"program\": [{\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, 0, {\"value\": 0.3}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.4}, {\"value\": -0.3}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.3}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, 0, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.4}, {\"value\": -0.3}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.4}, {\"value\": -0.3}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.3}, 0, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": -0.2}, {\"value\": -0.6}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, 0, {\"value\": 0.3}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": -0.7}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.4}, 0, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"value\": -0.7}, {\"value\": -0.2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": -0.1}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": 0.9}, {\"value\": 0.8}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, 0, {\"value\": 0.3}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": 0.9}, {\"value\": 0.8}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, 0, {\"value\": 0.3}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, 0, {\"value\": -0.1}, {\"value\": 0.9}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, 0, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": 0.4}, {\"value\": 0.3}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": 0.4}, {\"value\": 0.3}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, 0, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.3}, 0, {\"value\": -0.3}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, 0, {\"value\": 0.3}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.4}, {\"value\": -0.1}, {\"function\": \"<ufunc 'multiply'>\", \"name\": \"mul\", \"arity\": 2}, {\"value\": -0.3}, 0, {\"function\": {}, \"name\": \"div\", \"arity\": 2}, {\"value\": -0.7}, {\"value\": -0.2}, {\"function\": \"<ufunc 'subtract'>\", \"name\": \"sub\", \"arity\": 2}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, 0, {\"value\": 0.3}, {\"function\": \"<ufunc 'add'>\", \"name\": \"add\", \"arity\": 2}, {\"value\": -0.7}, {\"value\": 0.9}], \"raw_fitness_\": 0.0017450904199366553, \"hits\": 0, \"trial\": 2, \"probability\": 1.0, \"metric\": {\"function\": {}, \"title\": \"Mean Square Error\", \"greater_is_better\": false, \"sign\": -1}, \"depth_\": 10}}], \"average_cost\": 0.0017450904199366553}"

TaskResult 模型的 result 字段是一个 TextField,因此它的类型是字符串。我在views.py中使用的代码sn-p如下所示;

run_list = request.user.run_set.all().order_by('-start_time')
context = {'run_list': run_list}
return render(request, 'webapp/home.html', context)

当我尝试访问 run_list 中运行结果的元素时,我失败了。因为它不是模板中的 JSON 对象。我试了一下,代码sn-p如下图;

<table>
{% for run in run_list %}
    <tr><td> {{run.task.result.average_cost}} </td></tr>
{% endfor %}
</table>

它什么也没有显示...之后我尝试将结果字段转换为 JSON,但我又失败了。尝试以下代码;

run_list = request.user.run_set.all().order_by('-start_time')
for run_item in run_list:
    run_item.task.result = json.loads(json.loads(run_item.task.result))

那么,解决方案是什么?如何访问模板中结果字段的average_cost 元素?

【问题讨论】:

  • 说“我又失败了”而不解释你是怎么失败的完全没用(参见idownvotedbecau.se/itsnotworking)。
  • 是的,你是对的。我将添加失败的详细信息。谢谢。

标签: python json django django-celery


【解决方案1】:

这里:

run_item.task.result = json.loads(json.dumps(run_item.task.result))

只需删除json.dumps(...) 调用:

run_item.task.result =  json.loads(run_item.task.result)

nb : json.dumps(obj) 是将 Python 对象序列化为 json 字符串。

编辑:

它不工作。结果类型又是字符串

这一定与run_item(不管它是什么——你没有发布你的模型代码)如何处理它的result属性有关。在不知道您的代码的情况下,我无法准确说出正确的解决方案是什么,但我现在能想到的最好的方法是让您的 Run 模型负责 task.result json 解析,即:

import json

class Run(models.Model):
    # your code here

    def results(self):
        return json.loads(self.task.result)

然后从您的视图中删除整个处理,并在您的模板中使用run.result.average_cost。

【讨论】:

  • 它不工作。 result 的类型又是字符串。在模板中,没有任何显示。
  • @CeylanB。 cf我编辑的答案。我可以向您保证,将您的示例结果字符串传递给 json.loads() 确实有效(这是我在回答之前测试的第一件事)。
  • 你的意思是 run.results.average_cost 而不是 run.result.average_cost,对吧?
  • 我尝试了更新的解决方案,但它也不起作用。相同。结果的类型又是字符串。为了方便起见,我添加了一个模板标签来获取对象的类型。当我应用您的解决方案时,结果类型再次显示为&lt;class 'str'&gt;。
  • 我已经解决了这个问题。我在return json.loads(self.task.result) 中添加了一个额外的json.loads。并且result 的类型更改为dict。您能否相应地更新您的答案?这行return json.loads(self.task.result) 应该是return json.loads(json.loads(self.task.result))。
猜你喜欢
  • 2022-11-25
  • 2019-09-25
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
相关资源
最近更新 更多