【问题标题】:dictionary key and value in combine with django query字典键和值结合 django 查询
【发布时间】:2018-07-12 10:22:50
【问题描述】:

我有一个非常复杂的案例,我无法在 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" 循环,我在其中检查 _370 和 _397 等键末尾的 id,如果适合该键,我想检索它的值如果它的长度超过 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")

【问题讨论】:

    标签: python django python-3.x dictionary key-value


    【解决方案1】:

    如果我理解正确的话,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
    

    【讨论】:

    • 是的,您完全理解我想要做的事情,并且您转换的列表实际上就是我所追求的。让我来看看如何结合 django 数据库查询。
    • 非常感谢。还有一件事,我需要,如何在 for 循环中访问 id 397 及其值,如 try_3
    • 非常感谢,你拯救了我的一天 :)
    猜你喜欢
    • 2018-05-15
    • 2021-12-18
    • 2011-07-18
    • 2011-06-14
    • 2020-07-16
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多