我正在尝试使用函数转换货币。但我不断收到错误。
类型错误 - 字符串索引必须是整数,而不是str
有人可以帮忙吗?
追溯(here)
def exchange(price, current, target):
try:
price *= Exchangerate.objects.get(basecurrency=current, targetcurrency=target).exchangerate
except Exception:
pass
return price
def symbol(symbol):
try:
symbol = Currency.objects.get(symbol=symbol).symbol
except Exception:
print
return symbol
..............
class ProductItemView(APIView):
renderer_classes = (JSONRenderer, )
def get(self, request, *args, **kwargs):
try:
pk = int(kwargs['pk'])
except Exception:
return HttpResponse(status=status.HTTP_400_BAD_REQUEST)
result = (
Product.objects
.filter(pk=pk)
.values('pk', 'name',)
.annotate(
currency=F('variation__price__currency'),
currencycode=F('variation__price__currency__currencycode'),
symbol=F('variation__price__currency__symbol'),
price=F('variation__price__price'),
)
.order_by('variation__price__created')
).first()
img = Image.objects.filter(variation__product=pk).all().values('image')
result['image'] = list(set(i["image"] for i in img))
for i in result:
i['price'] = str(i['price']) + ' (Estimate: ' + (symbol(user.settings_currency.symbol)) + ' ' + "{:.2f}".format((exchange(i['price'], i['currency'], user.settings_currency.id,))) + ' )'
del i['price']
return Response(result)
答案 0 :(得分:1)
所以,我对你的Product对象一无所知,所以根据我看到的选项来看我的想法。
1)结果可能是一个字符串,而不是一个字典,因为它似乎正在为它分配一个看似可迭代对象的第一个元素。如果是这种情况,请检查Product.object(...)。first()实际返回的内容。
2)您可能希望获得字典列表/元组。在这种情况下,不要从Product.objects(..)中选择.first()。然后用“for i in result:”等来迭代该词典列表是有意义的。
3)如果你打算获得Product.object(..)元组的第一个成员,那么你的for循环实际上循环了这个字典的项目。我很可能成为一个字符串,你只能使用整数索引。这将抛出你看到的异常。要修复,请删除for循环。
在我看来,结果是字典,因为对结果['image']的赋值似乎工作正常。在这种情况下,我的项目3)适用于您的情况。但是,我不确定这是否是您正在寻找的行为?
答案 1 :(得分:1)
您的堆栈跟踪显示错误在此处:
i['price'] = str(i['price']) + ' (Estimate: ' +
(symbol(user.settings_currency.symbol)) +
' ' + "{:.2f}".format((exchange(i['price'], i['currency'],
user.settings_currency.id,))) + ' )'
您在这里尝试i
作为字典。您只能为字典使用i ['somestring']表示法。但python告诉你,你不能将它与i
一起使用,因为它是一个字符串!这基本上是指</ p>的含义
异常值:字符串索引必须是整数,而不是str
无论如何,i
不是python的字典。但那怎么可能呢?很难弄清楚不是吗。如果您的代码更简单怎么办?事实上它可以。
result = Product.objects
.filter(pk=pk)
.values('pk', 'name',)
.annotate(
currency=F('variation__price__currency'),
currencycode=F('variation__price__currency__currencycode'),
symbol=F('variation__price__currency__symbol'),
price=F('variation__price__price'),
)
.order_by('variation__price__created')[0]
img = Image.objects.filter(variation__product=pk).all().values('image')
result['image'] = list(set(i["image"] for i in img))
result['price'] = str(result['price']) + ' (Estimate: ' + (symbol(user.settings_currency.symbol)) + ' ' + "{:.2f}".format((exchange(result['price'], result['currency'], user.settings_currency.id,))) + ' )'
return Response(result)
如果错误仍然存在,请告诉我。