django连续数年

时间:2015-02-01 22:04:10

标签: python django

我正在撰写一份有股票和股息的网页。所以为了简化,我的模型是这样的:

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

1 个答案:

答案 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