字典键和值结合 Django 查询
dictionary key and value in combine with django query
我有一个非常复杂的案例,我无法解决django中的相关字典功能。
这是我通过 html post messages.add_message(request, messages.INFO, data) 函数检索的数据输出:
{'id_370': '370', '350_370': 'try_1', '450_370': 'try_2', 'id_397': '397', '350_397': 'try_3', '450_397': 'try_4'}
try-1 try-2 try-3 try-4 是我想在我的数据库中更新的输入。
基本上我想要做的是寻找 id_ 并使用此命令过滤该对象 qs = FP.objects.filter(id=i.lstrip('id_')
直到这里(第一个 for 循环)它工作正常。
我不能做的是另一个 for "for x in val" 循环,我在其中检查密钥末尾的 id,如 _370 和 _397,如果适合该密钥,我想检索它如果长度超过 1,则更新我的数据库。
我从 2 周开始就尝试这样做并阅读了很多文档,但我的技能不足以解决问题,但我认为我在正确的道路上,不是吗?如果有人启发我,我会很高兴。 :)
下面是我的 view.py 我遇到逻辑问题的地方
else:
if request.method == 'POST':
data = request.POST.dict()
data.pop('csrfmiddlewaretoken', None)
ids = [k for k in data.keys() if 'id_' in k]
messages.add_message(request, messages.INFO, data)
for i in ids:
val = [b for b in data.keys() if '_' + i in b]
#messages.add_message(request, messages.INFO, val)
#messages.add_message(request, messages.INFO, i.lstrip('id_'))
qs = FP.objects.filter(id=i.lstrip('id_'))
for x in val:
updates = {}
if len(data.values[x]) > 1 and '350_' in data.keys():
updates['P_350'] = data.values[x]
if len(data.values[x]) > 1 and '450_' in data.keys():
updates['P_450'] = data.values[x]
if updates:
qs.update(**updates)
return render(request,"index.html")
如果我没理解错的话,字典包含两个 ID 以及与这些 ID 相关的一些值,格式为
id_<tid>
= 事物编号
<vid>_<tid>
= 与事物相关的值
所以像
data = {'id_370': '370', '350_370': 'try_1', '450_370': 'try_2', 'id_397': '397', '350_397': 'try_3', '450_397': 'try_4'}
ids = {k.split('_')[1] for k in data if k.startswith('id_')}
groups = {}
for id in ids:
groups[id] = {
k.split('_')[0]: v
for (k, v)
in data.items()
if not k.startswith('id_') and k.endswith('_' + id)
}
print(groups)
将数据转换成更可口的形式:
{
'397': {'350': 'try_3', '450': 'try_4'},
'370': {'350': 'try_1', '450': 'try_2'},
}
有了它,您应该更直接地遍历事物 ID 并使用值进行操作:
for thing_id, values_dict in groups.iteritems():
# get thing from database, update it if needed
编辑: 例如,打印所有内容:
for thing_id, values_dict in groups.items():
for value_id, value_value in values_dict.items():
print(thing_id, value_id, value_value)
打印
397 350 try_3
397 450 try_4
370 350 try_1
370 450 try_2
我有一个非常复杂的案例,我无法解决django中的相关字典功能。
这是我通过 html post messages.add_message(request, messages.INFO, data) 函数检索的数据输出:
{'id_370': '370', '350_370': 'try_1', '450_370': 'try_2', 'id_397': '397', '350_397': 'try_3', '450_397': 'try_4'}
try-1 try-2 try-3 try-4 是我想在我的数据库中更新的输入。
基本上我想要做的是寻找 id_ 并使用此命令过滤该对象 qs = FP.objects.filter(id=i.lstrip('id_')
直到这里(第一个 for 循环)它工作正常。
我不能做的是另一个 for "for x in val" 循环,我在其中检查密钥末尾的 id,如 _370 和 _397,如果适合该密钥,我想检索它如果长度超过 1,则更新我的数据库。
我从 2 周开始就尝试这样做并阅读了很多文档,但我的技能不足以解决问题,但我认为我在正确的道路上,不是吗?如果有人启发我,我会很高兴。 :)
下面是我的 view.py 我遇到逻辑问题的地方
else:
if request.method == 'POST':
data = request.POST.dict()
data.pop('csrfmiddlewaretoken', None)
ids = [k for k in data.keys() if 'id_' in k]
messages.add_message(request, messages.INFO, data)
for i in ids:
val = [b for b in data.keys() if '_' + i in b]
#messages.add_message(request, messages.INFO, val)
#messages.add_message(request, messages.INFO, i.lstrip('id_'))
qs = FP.objects.filter(id=i.lstrip('id_'))
for x in val:
updates = {}
if len(data.values[x]) > 1 and '350_' in data.keys():
updates['P_350'] = data.values[x]
if len(data.values[x]) > 1 and '450_' in data.keys():
updates['P_450'] = data.values[x]
if updates:
qs.update(**updates)
return render(request,"index.html")
如果我没理解错的话,字典包含两个 ID 以及与这些 ID 相关的一些值,格式为
id_<tid>
= 事物编号<vid>_<tid>
= 与事物相关的值
所以像
data = {'id_370': '370', '350_370': 'try_1', '450_370': 'try_2', 'id_397': '397', '350_397': 'try_3', '450_397': 'try_4'}
ids = {k.split('_')[1] for k in data if k.startswith('id_')}
groups = {}
for id in ids:
groups[id] = {
k.split('_')[0]: v
for (k, v)
in data.items()
if not k.startswith('id_') and k.endswith('_' + id)
}
print(groups)
将数据转换成更可口的形式:
{
'397': {'350': 'try_3', '450': 'try_4'},
'370': {'350': 'try_1', '450': 'try_2'},
}
有了它,您应该更直接地遍历事物 ID 并使用值进行操作:
for thing_id, values_dict in groups.iteritems():
# get thing from database, update it if needed
编辑: 例如,打印所有内容:
for thing_id, values_dict in groups.items():
for value_id, value_value in values_dict.items():
print(thing_id, value_id, value_value)
打印
397 350 try_3
397 450 try_4
370 350 try_1
370 450 try_2