我有一个收件人查询,其中包含两个 ID 1和2 的收件人: 我遍历每一个来构建json输出:
data = []
this_tem = {}
for item in recipients:
this_tem['recipient_id'] = item.pk
data.append(this_tem)
return HttpResponse(json.dumps(data), mimetype='application/json')
这给了我:
[
{
"recipient_id": 2,
},
{
"recipient_id": 2,
}
]
你可以看到它应该是recipient_id 1
和recipient_id 2
但是,我的循环会覆盖值,为什么?
答案 0 :(得分:5)
this_tem
是对您在循环中反复修改和追加的单个对象(dict)的引用。您在循环中覆盖该键的值。
您需要在每次迭代时创建一个新的dict:
data = []
for item in recipients:
this_tem = {}
this_tem['recipient_id'] = item.pk
data.append(this_tem)
修改强>
正如Grijesh Chauhan慷慨地指出的那样,表达式和循环可以通过列表理解来简化:
data = [{'recipient_id': item.pk} for item in recipients]
答案 1 :(得分:3)
你要附加一个字典,这是一个可变对象。
因此在循环之后,data
包含对同一字典的两个引用。
您必须在每次迭代中添加新词典,例如像这样:
for item in recipients:
data.append(dict(recipient_id = item.pk))
答案 2 :(得分:1)
这是因为this_tem在for循环
之外声明data = []
for item in recipients:
this_tem = {}
this_tem['recipient_id'] = item.pk
data.append(this_tem)
return HttpResponse(json.dumps(data), mimetype='application/json')