2016-04-22 19 views
1

通貨を変換する関数を使用しようとしています。しかし、私は間違いを続けている。クエリーセットで関数にエラーが発生しました

タイプエラー - 文字列のインデックスは

誰でも助けることができますが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

結果に何が印刷できますか?ほとんどの場合、インデックスとして '価格'のリストをループすることはできません。 – lapinkoira

+0

プリントはどこに貼り付け、どのように書きますか? – Yian

+0

あなたのDjangoはどうやって動いていますか? – lapinkoira

答えて

1

だから、私は、あなたのProductオブジェクトについて何も知りません私の考えは、私が見るオプションに基づいています。

1)iterableオブジェクトの最初の要素のように見えるので、結果は文字列であり、dictではないことがあります。このような場合は、Product.object(...)。first()が実際に返すものを確認してください。

2)辞書のリスト/タプルを取得したかった可能性があります。その場合、Product.objects(..)から.first()を選択しないでください。それで、辞書のリストを "for i in result:"のように繰り返します。

3)Product.object(..)タプルの最初のメンバーを取得しようと思ったら、ループは実際にこの辞書の項目をループします。私は文字列になり、整数インデックスのみを使用できます。これはあなたが見た例外をスローします。修正するには、forループを削除します。

result ['image']への代入がうまくいくように見えるので、resultは辞書です。その場合、私のアイテム3)はあなたの状況に適用されます。しかし、それがあなたが探している行動かどうかは分かりません。

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と一緒に使うことはできないと言っています!それは基本的にです

が何を意味するのか例外値:文字列のインデックスは、いずれにしても

を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) 

エラーが解決しない場合は、教えてください。

+0

ありがとうが、これは私に名前エラー(グローバル名 'i'は定義されていません)を与えます。 'i'を定義するコードを調整してください。 – Yian

+0

残念ながらコードを実行していません(依存関係がないのでできません)。更新答えiは結果 – e4c5

+0

に置き換えてくださいありがとう - 私は今 'NoneType'オブジェクトに属性 'シンボル'がないというエラーを受け取ります。 (http://dpaste.com/0VA755J)。私のアプリのどこかでこれを使っていますが、これは正しく動作しています。i ['price'] = str(i ['price'])+ '' + '(' +(symbol(user.settings_currency.symbol) :2)}。 ')' 'しかし、 - 私はこのコードをこの中で動作させることができません。(。exchange(i ['price']、i ['currency']、user.settings_currency.id)))例 – Yian

関連する問題