2017-05-08 83 views
0

我在學習Django,並構建了一個包含公司列表的小應用程序,其中包含每個公司的一些常規信息。主頁顯示所有公司的列表,然後用戶可以點擊公司名稱查看更多信息。我現在試圖通過使用Yahoo Finance來獲取關於公司的一些股票數據並將其顯示在頁面上來了解如何在Django中使用API​​。 (我在Python中多次使用了yahoo-finance軟件包,它非常簡單,這就是爲什麼我盯着這個)。我不需要將數據保存到數據庫(除非這是唯一的方法),我只是想顯示它。如何在Django中使用Yahoo Finance API

我已經安裝了pip打包並將其添加到settings.py文件中的APPS。

然後在我的views.py中,我添加了雅虎財務依賴關係,並試圖在下面的代碼中的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調用保存在View中,並創建了一個字典以將它們傳遞給模板。

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 

它看起來datayahoo_finance.Share可以直接使用的對象。你可以用data.__dict__看看,但應該只使用API​​中記錄的方法。

或者,您可能只需將data直接傳遞到模板中並使用{{data.get_market_cap}}即可。

希望這會有所幫助。

+0

完美,這就是我一直在尋找的。傳遞數據對象然後調用模板中的API是我不知道我可以做的額外獎勵。我更喜歡在View中保留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作爲接受的答案,因爲它還糾正了看起來好像是它的API調用不正確。 – pheeper

相關問題