在python django中获取前几个月的数据

在python django中获取前几个月的数据,python,django,python-3.x,django-models,python-dateutil,Python,Django,Python 3.x,Django Models,Python Dateutil,嗨,我用的是django,我的模型是这样的 class SignupMonthlyPoint(models.Model): user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='SignupMonthlyPoints') timestamp = models.DateTimeField(auto_now_add=True) value = models.FloatField()

嗨,我用的是django,我的模型是这样的

class SignupMonthlyPoint(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='SignupMonthlyPoints')
    timestamp = models.DateTimeField(auto_now_add=True)
    value = models.FloatField()
def get_signupfromlinkmonthlypoints():
    total_for_last_month =request.user.profile.SignupMonthlyPoint.filter(
    timestamp__gt=datetime.datetime.now() - relativedelta(months=1)
    ).aggregate(
    total=Sum('value')
    )['total']
    print(total_for_last_month)
我得到了最近30天的数据,就像这样

class SignupMonthlyPoint(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='SignupMonthlyPoints')
    timestamp = models.DateTimeField(auto_now_add=True)
    value = models.FloatField()
def get_signupfromlinkmonthlypoints():
    total_for_last_month =request.user.profile.SignupMonthlyPoint.filter(
    timestamp__gt=datetime.datetime.now() - relativedelta(months=1)
    ).aggregate(
    total=Sum('value')
    )['total']
    print(total_for_last_month)

但当我分析过去30天的数据时,不是上个月的数据。我想将整个8月的数据设置为9月的最后一个月,然后是整个7月的数据,依此类推。

我首先计算月的开始和结束日期:

now = timezone.now()
one_month_ago = datetime.datetime(now.year, now.month - 1, 1)
month_end = datetime.datetime(now.year, now.month, 1) - datetime.timedelta(seconds=1)
然后获取相应的
SignupMonthlyPoint
s:

SignupMonthlyPoint.objects.filter(user=request.user,
                                  timestamp__gt=one_month_ago,
                                  timestamp__lt=month_end)

您可能必须使用
时区。在日期上使用make_aware()
来添加时区,并使Django能够识别这些时区。我可以获得以前的1、2、3等月份的开始和结束日期吗?您也可以使用,而不是
\uu gt
\uu lt
。当然,只需循环若干个月并从中创建新的时间戳:
范围(1,4)中的i:datetime(now.year,now.month-i,1)
:构造函数是
datetime(year,month,day,…)
。您当前正在做的是获取当前月份的第2个,例如2019-09-02。但请小心,此算法在1月份不起作用,因为月份
0
不存在,并且将引发
ValueError