Итерация поля 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>
Пробовал другие 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