我正在
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)
答案 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(..)
操作的链,但您可以使用相同的也可以使这个分离。