在Python/Django中使用yield语句迭代json
Django模型中有一个名为json_field的char字段。我试图从视图中迭代它,但它只返回一个结果,就像return语句一样。我试图弄明白如何使用yield迭代json_字段 模型对象返回的结果如下:在Python/Django中使用yield语句迭代json,python,json,django,Python,Json,Django,Django模型中有一个名为json_field的char字段。我试图从视图中迭代它,但它只返回一个结果,就像return语句一样。我试图弄明白如何使用yield迭代json_字段 模型对象返回的结果如下: id : 1 title : "Some Title" json_field : [{"key":"value","key2":"value2"},{"key":"value","key2":"value2"}] created : "Sat Oct 21 2017 14:00:53 G
id : 1
title : "Some Title"
json_field : [{"key":"value","key2":"value2"},{"key":"value","key2":"value2"}]
created : "Sat Oct 21 2017 14:00:53 GMT+0300 (+03)"
view.py
import json
def MyView(request):
model_query = MyModel.objects.all() or MyModel.objects.filter or exclude...
for item in model_query:
data_item = json.loads(item.json_field)
template = "template.html"
context = {"title":title, "data_item":data_item}
return render(request, template, context)
在template.html中
{% for query_item in model_query %}
<table>
<thead>
<tr>
<th>{{ query_item.title }} - {{ query_item.created }}</th>
</tr>
</thead>
<tbody>
<tr>
<th>Some Heading </th>
<th>Some Heading </th>
</tr>
<!-- json data -->
{% for item in data_item %}
<tr>
<th>{{ item.key }}</th>
<td>{{ item.key2|floatformat:2 }}</td>
</tr>
{% endfor %}
<!-- json data -->
</thead>
</table><
{% endfor %}
{model_query%中查询项的%
{{query_item.title}-{{query_item.created}
一些标题
一些标题
{数据项中的项的%u%}
{{item.key}
{{item.key2 | floatformat:2}
{%endfor%}
<
{%endfor%}
任何帮助都将不胜感激 感谢您更新代码 现在,我将重新构造dict的json.load()列表,以便您可以使用它。这比在模板中弄乱样式要好
# Fetch data from db as queryset of dicts
items = list(MyModel.objects.filter().values('title', 'created', 'json_field'))
# Decode json in-place
for item in items:
item['json_field'] = json.loads(item['json_field'])
context = {"title":title, "items": items}
连接通过以下方式完成:
my_dict = dict()
for d in data_item
my_dict.update( d )
如果要合并,请选中此线程:
感谢您更新代码 现在,我将重新构造dict的json.load()列表,以便您可以使用它。这比在模板中弄乱样式要好
# Fetch data from db as queryset of dicts
items = list(MyModel.objects.filter().values('title', 'created', 'json_field'))
# Decode json in-place
for item in items:
item['json_field'] = json.loads(item['json_field'])
context = {"title":title, "items": items}
连接通过以下方式完成:
my_dict = dict()
for d in data_item
my_dict.update( d )
如果要合并,请选中此线程:
你好强> 解决方案取决于您的目的 如果要构造json数组列表,请使用理解:
data_items = [json.loads(item.json_field) for item in model_query]
。。。或json数组的生成器:
data_items = (json.loads(item.json_field) for item in model_query)
如果您想要一个json对象数组,请尝试以下方法:
data_items = []
for item in model_query:
data_items.extend(json.loads(item.json_field))
然后您可以使用数据\u项
作为模板上下文
小提示:如果使用PostgreSQL或MySQL,可以在ORM级别使用
JSONField
。如果计划在该字段上进行任何筛选查询,请考虑此方法。作为额外的好处,JSON编码/解码将是现成的。您好强>
解决方案取决于您的目的
如果要构造json数组列表,请使用理解:
data_items = [json.loads(item.json_field) for item in model_query]
。。。或json数组的生成器:
data_items = (json.loads(item.json_field) for item in model_query)
如果您想要一个json对象数组,请尝试以下方法:
data_items = []
for item in model_query:
data_items.extend(json.loads(item.json_field))
然后您可以使用数据\u项
作为模板上下文
小提示:如果使用PostgreSQL或MySQL,可以在ORM级别使用
JSONField
。如果计划在该字段上进行任何筛选查询,请考虑此方法。作为额外的好处,JSON编码/解码将是现成的。您可以为模板准备数据集
# Fetch data from db as queryset of dicts
items = list(MyModel.objects.filter().values('title', 'created', 'json_field'))
# Decode json in-place
for item in items:
item['json_field'] = json.loads(item['json_field'])
context = {"title":title, "items": items}
然后通过模板中的项目进行交互:
{% for query_item in model_query %}
{% for item in query_item.loaded_json %}
<span>{{ item.key }}</spam>
{% endfor %}
{% endfor %}
{items%]中的项的%
{{item.title}}-{{item.created}
一些标题
一些标题
{item.json_字段%]中的条目为%
{{entry.key}
{{entry.key2 | floatformat:2}
{%endfor%}
<
{%endfor%}
您可以为模板准备数据集
# Fetch data from db as queryset of dicts
items = list(MyModel.objects.filter().values('title', 'created', 'json_field'))
# Decode json in-place
for item in items:
item['json_field'] = json.loads(item['json_field'])
context = {"title":title, "items": items}
然后通过模板中的项目进行交互:
{% for query_item in model_query %}
{% for item in query_item.loaded_json %}
<span>{{ item.key }}</spam>
{% endfor %}
{% endfor %}
{items%]中的项的%
{{item.title}}-{{item.created}
一些标题
一些标题
{item.json_字段%]中的条目为%
{{entry.key}
{{entry.key2 | floatformat:2}
{%endfor%}
<
{%endfor%}
如果您使用的是PostgreSQL,则可以使用。它使用postgres的jsonb类型,该类型为保持json可序列化文本而优化
如果没有,您仍然可以使用。它几乎提供了相同的功能,尽管django的JSONField的一些很酷的特性不可用(如)
如果这些都不适合您,您还可以通过从CharField或TextField继承并重写某些函数来实现自己的JSONField。这样,您就不需要在视图中使用任何字段逻辑
编辑:
如果你发现改变你的领域很困难或者出于任何原因不想这样做,你可以在你的观点中这样做:
for item in model_query:
item.loaded_json = json.loads(item.json_field)
然后可以像模板中的普通字段一样使用它:
{% for query_item in model_query %}
{% for item in query_item.loaded_json %}
<span>{{ item.key }}</spam>
{% endfor %}
{% endfor %}
{model_query%中查询项的%
{查询中的项为%u item.loaded\u json%}
{{item.key}
{%endfor%}
{%endfor%}
如果您使用的是PostgreSQL,则可以使用。它使用postgres的jsonb类型,该类型为保持json可序列化文本而优化
如果没有,您仍然可以使用。它几乎提供了相同的功能,尽管django的JSONField的一些很酷的特性不可用(如)
如果这些都不适合您,您还可以通过从CharField或TextField继承并重写某些函数来实现自己的JSONField。这样,您就不需要在视图中使用任何字段逻辑
编辑:
如果你发现改变你的领域很困难或者出于任何原因不想这样做,你可以在你的观点中这样做:
for item in model_query:
item.loaded_json = json.loads(item.json_field)
然后可以像模板中的普通字段一样使用它:
{% for query_item in model_query %}
{% for item in query_item.loaded_json %}
<span>{{ item.key }}</spam>
{% endfor %}
{% endfor %}
{model_query%中查询项的%
{查询中的项为%u item.loaded\u json%}
{{item.key}
{%endfor%}
{%endfor%}
您没有显示足够的代码。您如何处理数据项?发布整个视图。我扩展了代码@DanielRoseman。我想简化我的代码,这就是为什么我没有添加整个代码。很抱歉,您没有显示足够的代码。您如何处理数据项?发布整个视图。我扩展了代码@DanielRoseman。我想简化我的代码,这就是为什么我没有添加整个代码。很抱歉。