2017-05-08 37 views
0

私はDjangoを学びたいと思っています。それぞれについていくつかの一般的な情報を持つ企業のリストを含む小さなアプリを作っています。ホームページにはすべての企業のリストが表示され、ユーザーは企業名をクリックして詳細情報を表示することができます。私は現在、DjangoでYahoo Financeを使用して会社に関する株式データを取得し、それをページに表示することによって、APIがどのように消費されているかを把握しようとしています。 (私はPythonでyahoo-financeパッケージを何度も使用してきましたが、これはかなり簡単です。これが私がこれを見つめた理由です)。私はデータベースにデータを保存する必要はありませんが(それが唯一の方法でない限り)、単に表示したいだけです。DjangoでYahoo Finance APIを使用する方法

私はpipパッケージをインストールして、それをsettings.pyファイルのAPPSに追加しました。

私のviews.pyではyahoo-financeの依存関係を追加し、APIの下のコードで作業を試みました。テンプレートの中で私は{{mkt_cap}}を使っています。このようにして、私はYQLResponseMalformedErrorを得ています。これが正しい方法ではないかもしれないことは分かっていますが、それを理解するのは難しいです。

from django.views import generic 
from .models import Company, Articles, Transcripts, TranscriptDetails 
from yahoo_finance import Share 
import json 

class CompanyDetails(generic.DetailView): 
    model = Company 
    template_name = 'company_details.html' 

    def get_context_data(self, **kwargs): 
     pk = self.kwargs.get('pk') 
     context = super(CompanyDetails, self).get_context_data(**kwargs) 
     context['articles'] = Articles.objects.filter(company_id=pk).order_by('-date') 
     context['company'] = Company.objects.get(id=pk) 
     context['transcripts'] = Transcripts.objects.filter(company_id=pk).order_by('-date') 
     # Get Yahoo API data 
     stock_symbol = Company.objects.filter(id=pk).values_list('stock_symbol', flat=True) 
     data = Share(stock_symbol) 
     data = json.load(data) 
     context['mkt_cap'] = data 

     return context 

EDITは

ここでは他のケースの誰かで最終的なコードは、同様の質問を持っています。私はすべてのAPI呼び出しをViewに保存し、それらをテンプレートに渡すための辞書を作成しました。

以下これらIと同様の使用にアクセスするためのテンプレートで次に
class CompanyDetails(generic.DetailView): 
    model = Company 
    template_name = 'company_details.html' 

    def get_context_data(self, **kwargs): 
     pk = self.kwargs.get('pk') 
     context = super(CompanyDetails, self).get_context_data(**kwargs) 
     context['articles'] = Articles.objects.filter(company_id=pk).order_by('-date') 
     context['transcripts'] = Transcripts.objects.filter(company_id=pk).order_by('-date') 
     # Get Yahoo API data 
     stock_symbol = self.object.stock_symbol 
     data = Share(stock_symbol) 
     stock_open = data.get_open() 
     year_range = data.get_year_range() 
     fifty_day_moving_average = data.get_50day_moving_avg() 
     market_cap = data.get_market_cap() 

     yahoo_finance = dict() 
     yahoo_finance['stock_open'] = stock_open 
     yahoo_finance['year_range'] = year_range 
     yahoo_finance['fifty_day_moving_average'] = fifty_day_moving_average 
     yahoo_finance['market_cap'] = market_cap 
     context['yahoo_finance'] = yahoo_finance 

     return context 

{{ yahoo_finance.stock_open }} 
{{ yahoo_finance.year_range }} 
{{ yahoo_finance.fifty_day_moving_average }} 
{{ yahoo_finance.market_cap }} 

答えて

3

あなたは、市場のキャップをしたい場合は、あなただけの

data = Share(stock_symbol) 
market_cap = data.get_market_cap() 
context['mkt_cap'] = market_cap 

を行うことができますそれはdataがあるに見えます直接使用できるオブジェクトはyahoo_finance.Shareです。あなたはdata.__dict__で内部を見ることができますが、おそらくAPIに書かれているメソッドを使うべきです。

また、dataを直接テンプレートに渡し、{{data.get_market_cap}}を使用すると便利です。

これが役に立ちます。

+0

パーフェクト、これは私が探していたものです。データオブジェクトを渡してから、テンプレート内でAPIを呼び出すことは、私ができることを知らなかった追加のボーナスです。私はビューでAPIリクエストを維持することを好むので、追加のリクエストをそこに追加するための辞書を作成しました。 – pheeper

1

values_listメソッドはリストを返します。文字列が必要なShareに渡しています。

最も簡単な修正がそれを変更するには、次のようになります。

stock_symbol = Company.objects.filter(id=pk).values_list('stock_symbol', flat=True)[0] 
data = Share(stock_symbol) 

しかし、あなたは、すべてのデータベースから会社を取得する必要はありません - DetailViewはあなたのためにこれを行います。したがって、self.object.stock_symbolを株価チャートの形にすることができます

def get_context_data(self, **kwargs): 
    context = super(CompanyDetails, self).get_context_data(**kwargs) 
    context['articles'] = Articles.objects.filter(company=self.object).order_by('-date') 
    context['transcripts'] = Transcripts.objects.filter(company=self.object).order_by('-date') 
    # Get Yahoo API data 
    stock_symbol = self.object.stock_symbol 
    data = Share(stock_symbol) 
    data = json.load(data) 
    context['mkt_cap'] = data 

    return context 
+1

この回答は、「context ['company']」コード行は必要ないと指摘していますが、@ user6731765を受け入れられた回答として選択しました。間違っている。 – pheeper

関連する問題