Python django连续年份数

Python django连续年份数,python,django,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_place

我正在写一个关于股票和股息的网页。为了简化,我的模型是这样的:

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来计算此值?
编辑:

3.我刚才注意到了。

我考虑过你的评论,我就是这么想的。
remram:SQL不必要的困难。
戴雷:首先我认为这是个好主意,但现在我不太确定了。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

“2008-2014”不是连续7年吗?是的,对不起。这在SQL中是可行的,即使没有分析函数。但这很难。我会看看我是否能做点什么。我只需要每月更新这个值一次左右,所以它不必非常有效。我只是想知道是否有比values()或dates()更好的方法。使用原始SQL是不必要的困难。从没有支付股息的年份上市开始怎么样?毫无疑问,无股息年份之间的差异会产生股息支付的连续年份数。例如,2001年、2004年和2010年的无股息年份表明您有2年和5年的支付期。这将大大减少计算和比较的事情。