如何在Django中使用Yahoo Finance API

时间:2017-05-08 15:55:07

标签: python django

我正在尝试学习Django并构建了一个小应用程序,其中包含公司列表,其中包含每个公司的一般信息。主页显示所有公司的列表,然后用户可以单击公司名称以查看更多信息。我现在正在尝试通过使用Yahoo Finance获取有关公司的一些股票数据并将其显示在页面上来弄清楚如何在Django中使用API​​。 (我在Python中多次使用过yahoo-finance软件包,这很简单,这就是为什么我盯着这个)。我不需要将数据保存到数据库(除非这是唯一的方法),我只是想显示它。

我已经打包已安装打包并将其添加到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

然后在模板中访问这些我类似使用以下内容:

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

2 个答案:

答案 0 :(得分:3)

如果你想要市值,你可以做到

SELECT *, Count(*)
FROM yahrzeit
WHERE confirmed = 1

INNER JOIN tbldecedent ON CONCAT( yahrzeit.firstName,  ' ', yahrzeit.middleName,  ' ', yahrzeit.lastName ) = tbldecedent.Name
AND DATE_FORMAT( CONCAT( yahrzeit.gregorianYear,  '-', yahrzeit.gregorianMonthNum,  '-', yahrzeit.gregorianDay ) ,  '%Y-%m-%d' ) = tbldecedent.EngDate

GROUP BY tbldecedent.Name, tbldecedent.EngDate

它看起来data = Share(stock_symbol) market_cap = data.get_market_cap() context['mkt_cap'] = market_cap 是一个data对象,您可以直接使用它。您可以使用yahoo_finance.Share查看内部,但应该只使用API​​中记录的方法。

或者,您可以直接将data.__dict__传递给模板并使用data

希望这有帮助。

答案 1 :(得分: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