我正在撰写一份有股票和股息的网页。所以为了简化,我的模型是这样的:
class Stock(models.Model):
name = models.CharField("Stock's name", max_length=200)
class Dividend(models.Model):
date = models.DateField('pay date')
amount = models.DecimalField(max_digits=20, decimal_places=10)
stock = models.ForeignKey(Stock)
我想计算每个股票支付股息的连续年数。那年分红的纯粹存在就足够了。如果公司在2000-2005和2008-2014期间支付股息,我想得到7号。计算它的最佳方法是什么?我想出了:
1.如果有任何股息(请求太多),每年查询一次
2.使用values()或values_list()仅获取不同有序年份的列表,然后迭代该列表
我会选择数字2.有没有更好的方法如何使用queryset来计算这个值?
编辑:
我刚刚注意到dates。
答案 0 :(得分:0)
我考虑过你的意见,这就是我的想法 remram:SQL不必要的困难 dylrei:首先我认为这是一个好主意,但现在我不太确定。 70年前可能会有一个股息,然后连续69年没有股息。如果股票不支付股息,我应该可以快速获得0年。另外,我不知道怎么过年,Django没有分红 这就是我想出的:
def get_years_paying(symbol):
"""
get number of consecutive years paying dividends for Stock by symbol
:param symbol:
:return: number of years
"""
num_years = 0
iteration_year = date.today().year
dividend_years = Dividend.objects.filter(
stock__symbol=symbol, spinoff=False, special=False, split=False
).dates(
"date", "year", order='DESC'
)
dividend_years_list = [i.year for i in dividend_years]
while True:
if iteration_year in dividend_years_list:
num_years += 1
elif iteration_year == date.today().year:
pass # current year is optional, there will be no dividends on 1. January
else:
return num_years if num_years != 0 else None
iteration_year -= 1