在queryset上键入包含函数的错误

时间:2016-04-22 08:00:19

标签: python django

我正在尝试使用函数转换货币。但我不断收到错误。

  

类型错误 - 字符串索引必须是整数,而不是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)

2 个答案:

答案 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)

如果错误仍然存​​在,请告诉我。