Итерация поля JSON, соответствующего объекту

Представление получает запрос пользователя и затем возвращает соответствующий объект в модели 'ControleProdutos' db.

views.py

def relatorio_produtos(request):
    if request.method == 'POST':
        prod_json = ControleProduto.objects.get(pk = request.POST.get('periodo'))
        return render(request, 'selecao/historico-produtos.html', {'prod_json':prod_json})
    else:
        return HttpResponseRedirect('/relatorios')

model.py

class ControleProduto(models.Model):
    periodo = models.DateTimeField(auto_now_add= True, verbose_name='Período')
    produtos = models.JSONField(verbose_name='Produtos')
    faturamento = models.FloatField(verbose_name='Faturamento')
    log_forma_pagamento = models.CharField(max_length=50, verbose_name='Forma de Pagamento')

    def __str__(self):
        return "{} {} {} {}".format(self.periodo, self.produtos, self.faturamento, self.log_forma_pagamento)
    
    def get_data(self):
        return{
            'periodo': self.periodo,
            'produtos': self.produtos,
            'faturamento': self.faturamento,
            'log_forma_pagamento': self.log_forma_pagamento
        }
class ListaProdutos(models.Model):
    nome_produto = models.CharField(max_length=50, verbose_name='Produto')
    quantidade_produto = models.IntegerField(verbose_name='Qntd.')
    vendido = models.IntegerField(verbose_name='Vendidos')
    data_adicao_prod= models.DateTimeField(auto_now_add= True ,verbose_name='Data de Adição')
    nota_produto = models.TextField(null=True, blank=True)
    custo = models.FloatField(verbose_name='Custo')
    tipo_produto = models.TextField(verbose_name='Tipo de Produto')

    def __str__(self):
        return "{} {} {} {} {} {} {} {}".format(self.nome_produto, self.quantidade_produto, self.vendido, self.data_adicao_prod, self.nota_produto, self.custo, self.tipo_produto)
    
    def get_data(self):
        return{
            'id': self.id,
            'nome_produto': self.nome_produto,
            'quantidade_produto': self.quantidade_produto,
            'vendido': self.vendido,
            'custo': self.custo,
            'tipo_produto': self.tipo_produto,
        }

Затем, в html файле я использую цикл for для итерации JSON-поля, но Django идентифицирует поле как строку.

html

<p>{{ prod_json.periodo }}</p>
<p>{{ prod_json.produtos }}</p>
<p>{{ prod_json.faturamento }}</p>
<p>{{ prod_json.log_forma_pagamento }}</p>



<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Produto</th>
            <th>Quantidade Vendida</th>
        </tr>
    </thead>
    {% for prod in prod_json.produtos %}
    <tbody>
        <tr>
            <td>{{prod.pk}}</td>
            
        </tr>
    </tbody>
    {% endfor %}
</table>

Print

enter image description here

Пробовал другие JSON файлы - тоже не работает;

Я попробовал {{ prod.filter.pk }} и это тоже не сработало;

Я просмотрел файл и не увидел явной ошибки

Django, вероятно, хранит JOSNField, produtos, в поле varchar или nvarchar в вашей базе данных.

Независимо от того, правда это или нет, вы, вероятно, могли бы решить эту проблему в методе get_data в ControleProduto.

Примером этого может быть:

def get_data(self):
    return{
        'periodo': self.periodo,
        'produtos': json.loads(self.produtos),
        'faturamento': self.faturamento,
        'log_forma_pagamento': self.log_forma_pagamento
    }

Помните, что вам придется добавить эту строку в начало файла models.py:

import json
Вернуться на верх