2017-05-08 5 views
0

나는 장고를 배우려고 노력 중이며 각각에 대해 몇 가지 일반적인 정보가있는 회사 목록이 들어있는 작은 앱을 만들었습니다. 홈 페이지에는 모든 회사의 목록이 표시되며 사용자는 회사 이름을 클릭하여 자세한 정보를 볼 수 있습니다. 이제는 Yahoo Finance에서 회사에 대한 주식 데이터를 얻고 페이지에 표시하는 방법으로 Django에서 API를 사용하는 방법을 파악하려고합니다. (필자는 파이썬에서 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 

편집

여기 경우 다른 사람의 마지막 코드가 비슷한 질문을 가지고 있습니다. 보기에서 모든 API 호출을 유지하고 사전을 만들어 템플릿에 전달했습니다.

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 

그런 다음 템플릿에서 다음이 I 유사한 사용에 액세스하려면 :

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

답변

3

그것은 data 보이는

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

는 당신이 시가 총액을 원하는 경우에, 당신은 단지 할 수 yahoo_finance.Share 개체를 직접 사용할 수 있습니다. data.__dict__으로 내부를 볼 수는 있지만 API에 문서화 된 방법 만 사용해야합니다.

또는 data을 템플릿에 직접 입력하고 {{data.get_market_cap}}을 사용할 수 있습니다.

희망이 도움이됩니다.

+0

Perfect, 내가 찾고있는 곳입니다. 데이터 객체를 전달한 다음 템플릿에서 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

관련 문제