IndexError元组索引超出范围

时间:2018-06-06 13:04:57

标签: python django

我正在

  

IndexError

     

元组索引超出范围

评论中的print也给出了ValueError 格式错误的节点或字符串:['(300,600)']

dict3={'diameter': {'attri': ['(300, 600)'], 'op': 'range'}} 
result = Product.objects.all()
for key, value in dict3.items():
    print(value['attri'])
    print(value['op'])  # print( ast.literal_eval(value['attri']))      

    if value['op'] is 'range':
        result = result.filter(**{'attributes__{}__{}'.format(key, value['op']): ast.literal_eval(value['attri'])})
    else:
        result = result.filter(**{'attributes__{}__{}'.format(key, value['op']): value['attri']})


print(result)

2 个答案:

答案 0 :(得分:0)

dict3 = {'diameter': {'attri': ['(300, 600)'], 'op': 'range'}} 
result = Product.objects.all()

for key, value in dict3.items():
    print('attri:', ast.literal_eval(value['attri'][0]))
    print('op:', value['op']) 

    if value['op'] == 'range':
        rg = ast.literal_eval(value['attri'][0])            
    else:
        rg = value['attri']
    result = result.filter(**{'attributes__{}__{}'.format(key, value['op']): rg})

    print(result)

答案 1 :(得分:0)

根据您的评论,您希望生成 union ,因此'attri'列表中的每个值都是一个条件,而 one 的事实被触发就足够了。

我们必须解决value['attri']是元组字符串的列表的问题。我们可以通过在元素上构建映射来实现。对所有这些执行literal_eval,然后对相应条件进行析取。类似的东西:

from ast import literal_eval
from functools import reduce
from operator import or_

dict3 = {'diameter': {'attri': ['(300, 600)'], 'op': 'range'}} 
result = Product.objects.all()

for key, value in dict3.items():
    # use == instead of is
    vls = value['attri']
    if value['op'] == 'range':
        vls = [literal_eval(vl) for vl in vls]
    cond_name = 'attributes__{}__{}'.format(key, value['op'])
    conditions = reduce(or_, [Q(**{cond_name: vl}) for vl in vls], Q())
    result = result.filter(conditions)

这将为所有其他运营商产生相同的析取行为。但请注意,dict3的不同项目将具有联合行为,因为您执行.filter(..)操作的,但您可以使用相同的也可以使这个分离。