在Python/Django中使用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

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 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。我想简化我的代码,这就是为什么我没有添加整个代码。很抱歉。