【问题标题】:Django shell command to change a value in json dataDjango shell命令更改json数据中的值
【发布时间】:2014-06-05 21:07:15
【问题描述】:

我是一个 django 新手,我在 django 的 manage.py shell 中玩耍。这是我在 shell 中尝试的东西:

>>> data
[{'primary_program': False, 'id': 3684}, {'primary_program': True, 'id': 3685}]
>>> data[0]
{'primary_program': False, 'id': 3684}
>>> data[1]
{'primary_program': True, 'id': 3685}
>>> data[0].values()
[False, 3684]
>>> data[1].values()
[True, 3685]
>>> 

我应该如何在此处发出命令以将data[1] 中的primary_program 的值更新为False 并保持json 的其余部分相同?

编辑:

这就是我获取数据的方式。我有一个休息框架 api,我正在使用序列化程序来读取数据。

>>> from acadprog.models import *
>>> from acadprog.serializers import *
>>> from django.http import Http404
>>> from rest_framework import status
>>> from rest_framework.views import APIView
>>> from rest_framework.decorators import api_view
>>> from rest_framework.response import Response
>>> qs = Student_academic_program.objects.filter(student=2773951)
>>> qs.values()
[{'academic_program_id': 595, 'academic_program_gpa': None, 'student_id': 2773951, 'credits_completed': 28, 'primary_program': False, u'id': 3684}, {'academic_program_id': 596, 'academic_program_gpa': None, 'student_id': 2773951, 'credits_completed': 26, 'primary_program': True, u'id': 3685}]
>>> len(qs.values())
2
>>> data = qs.values('id','primary_program')
>>> data
[{'primary_program': False, 'id': 3684}, {'primary_program': True, 'id': 3685}]
>>> data
[{'primary_program': False, 'id': 3684}, {'primary_program': True, 'id': 3685}]
>>> data[1]['primary_program'] = False
>>> data
[{'primary_program': False, 'id': 3684}, {'primary_program': True, 'id': 3685}]
>>> data['primary_program'][1] = False
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/abhishek/projects/texascompletes/local/lib/python2.7/site-packages/django/db/models/query.py", line 108, in __getitem__
    raise TypeError
TypeError
>>> data[1]['primary_program'] = False
>>> data
[{'primary_program': False, 'id': 3684}, {'primary_program': True, 'id': 3685}]

【问题讨论】:

  • 这不是 JSON,而是 Python 字典。

标签: python django


【解决方案1】:

由于data[1]只是一个字典,所以按键设置值:

>>> data = [{'primary_program': False, 'id': 3684}, {'primary_program': True, 'id': 3685}]
>>> data[1]['primary_program'] = False
>>> data
[{'primary_program': False, 'id': 3684}, {'primary_program': False, 'id': 3685}]

更新:

您在data 中得到的是一个查询集。如果您需要更新的字典列表,请将 queryset 转换为 list before:

>>> data = list(qs.values('id','primary_program'))
>>> data[1]['primary_program'] = False

如果要更新数据库中的值:

>>> qs = Student_academic_program.objects.filter(student=2773951)
>>> data = qs[1]
>>> data.primary_program = False
>>> data.save()

另外,如果您想为学生的所有课程将primary_program 设置为False,您可以使用update() 进行批量更新:

>>> Student_academic_program.objects.filter(student=2773951).update(primary_program=False)

【讨论】:

  • @crozzfire 你是什么意思它不工作?有什么错误吗? data 来自哪里?
  • 它没有给我带来任何错误......数据来自休息框架的序列化程序......我将用我得到的内容更新问题
  • 我更新了关于如何获取数据的问题
  • @crozzfire 陷阱。好的,谢谢,你打算如何处理修改后的data?是否需要更新数据库中的primary_program 值?
  • 是的。我有一个 put() 函数要更新,所以如果我的 api_view 中的数据发生变化,我会给出一个 serializer.save()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2020-01-10
相关资源
最近更新 更多