【问题标题】:How to query and update nested JSON data in Django如何在 Django 中查询和更新嵌套的 JSON 数据
【发布时间】:2021-12-31 03:31:42
【问题描述】:

我定义了下面的类来为投票系统做统计。

class FormPage(AbstractForm):
    submission_stats = models.JSONField(null=True, editable=False)

现在,我有以下格式的submission_stats

[
   {
      "id":4,
      "label":"checkboxes",
      "choices":[
         {
            "content":"option-A",
            "num_vote":0,
            "user_list":[
               
            ]
         },
         {
            "content":"option-B",
            "num_vote":0,
            "user_list":[
               
            ]
         },
         {
            "content":"option-C",
            "num_vote":0,
            "user_list":[
               
            ]
         }
      ]
   },
   {
      "id":7,
      "label":"Radio Button",
      "choices":[
         {
            "content":"option-1",
            "num_vote":0,
            "user_list":[
               
            ]
         },
         {
            "content":"option-2",
            "num_vote":0,
            "user_list":[
               
            ]
         },
         {
            "content":"option-3",
            "num_vote":0,
            "user_list":[
               
            ]
         }
      ]
   }
]

例如,当我收到 2 个投票提交时,我想相应地更新此 JSONField 中的 num_vote(从 0 到 2)和 user_list(从 [][user_a, user_b])字段。

请问如何查询和更新嵌套 JSONField 数据中的元素?

【问题讨论】:

  • 为什么你的表格中有mdels.JsonField?您想在哪里更新值?
  • 更新了帖子以反映我想要更新值的位置。 form 中的这个models.JsonField 属性用于统计表单提交结果。例如,有多少用户为选项 A 投票,这些用户是谁。

标签: python django django-jsonfield jsonfield


【解决方案1】:

安装json库 点安装json

import json

data = json.load(submission_stats)

现在这个数据是 python 字典。随心所欲地更新它

要将更新的数据保存回 json 字段,像这样将字典转换回 json

json.dumps(data, indent = 4)

然后保存

另外,如果你想在这个项目中使用 sql,我强烈推荐你使用

from django_extensions.db.fields.json import  JSONField

而不是

models.JSONField

因为 models.JSONField 不适合 SQL

【讨论】:

  • json.load(submission_stats) 给我错误:AttributeError: 'list' object has no attribute 'read' 因为我的submission_statsList 而不是Dictionary。换成Dictionary是唯一的出路吗?
  • 哎呀。抱歉没有注意到它是列表。试试 json.load(submission_stats[0])。是的,这是最可行和最合乎逻辑的方式。然后您可以通过键检索值并轻松更新它们
猜你喜欢
  • 2020-09-08
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多