如何在 django 模板中显示通过 django-celery-results 框架存储的 JSON 任务结果?

How to display JSON task results stored via django-celery-results framework in django template?

在我的项目中,我使用 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 中使用的代码片段如下所示;

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 对象。我尝试了下面的代码片段;

<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 元素?

这里:

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 字符串。

编辑:

It's not working. Type of result is string again

这一定与 run_item(无论它是什么 - 您没有 post 您的模型代码)如何处理它的 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