代码之家  ›  专栏  ›  技术社区  ›  İlkem Çetinkaya

结合Django查询的字典键和值

  •  1
  • İlkem Çetinkaya  · 技术社区  · 7 年前

    我有一个非常复杂的例子,我无法解决有关的字典功能在Django。

    这是我通过HTML邮件检索的数据输出。添加\u 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_u并用这个命令过滤该对象 qs = FP.objects.filter(id=i.lstrip('id_') 直到这里(第一个循环)它工作正常。

    我不能做的是另一个“for x in val”循环,在这个循环中,我检查键(如_370和_397)末尾的ID,如果它适合这个键,我想检索它的值,如果它的长度超过1,我想更新我的数据库。

    我试着从2周开始阅读大量的文档,但我的技能不足以解决问题,但我认为我走的是正确的道路,不是吗?如果有人开导我,我会很高兴的。:)

    下面是我的视图.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")
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   AKX Bryan Oakley    7 年前

    如果我理解正确,dict包含两个id,然后包含与这些id相关的一些值,格式为

    • id_<tid> =事物ID
    • <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