如何在Django模型中从今天减去日期

时间:2020-01-15 12:24:31

标签: python django date

models.py

import datetime as dt

 class Campaign(models.Model):
    enddate = models.DateField()


    def rest_of_the_day(self):
        now = dt.datetime.now().date()
        print('printing now value')
        print(now)
        print(self.campaign_enddate)
        return (self.campaign_enddate-now).days

in views.py

def landing_page(request):
    campaigns = Campaign.objects.all().order_by('-id')
    return render(request, 'core/landing_page.html',{'campaigns':campaigns})

在html模板中

      <span>{{campaign.rest_of_the_day}}</span>

我正在尝试使用Model.py中的rest_of_the_day函数在html文件中存储结束日期并显示到结束日期为止的天数

例如:如果结束日期为2010年1月30日,今天为2020年1月15日,我希望rest_of_the_day显示15

但是,我在/不受支持的操作数类型处收到 TypeError-:'NoneType'和'datetime.date'

2 个答案:

答案 0 :(得分:2)

似乎self.campaign_enddateNone。这很有意义,因为它不是您定义的字段。您可以使用enddate

class Campaign(models.Model):
    enddate = models.DateField()

    def rest_of_the_day(self):
        return (self.enddate-dt.date.today()).days

不过,您可以在此处使用|timeuntil template filter [Django-doc]

<span>{{ campaign.enddate|timeuntil }}</span>

这样可以更方便地处理直到某个日期(时间)发生为止的时间。

答案 1 :(得分:1)

另一种选择是在查询中使用database functions将列添加到QuerySet结果中。

这里QuerySet结果中的每个广告系列对象的td列的类型为datetime.timedelta

from django.db.models.functions import Extract, Now, Trunc

campaigns = Campaign.objects.all().order_by('-id').annotate(
    td=F('enddate') - Now()
)

或添加Trunc结果td列将是datetime.timedelta个对象,只有几天 我们还需要将日期和日期时间之间的计算转换为一种类型/ output_field。

campaigns = Campaign.objects.all().order_by('-id').annotate(
    td=Trunc(
        F('enddate') - Now(),
        'day',
        output_field=models.DateField()
    )
)

请注意,您将在datetime.timedelta对象上进行操作。此外,由于要四舍五入和减去天数,因此在不同部分(TruncNow()F('enddate'),不同组合)上加上whole expression可能会产生略有不同的结果。您可以尝试一下。

要获得整数()的结果,可以将Extract函数添加到组合中:

campaigns = Campaign.objects.all().order_by('-id').annotate(
    td=Extract(
        F('enddate') - Trunc(Now(), 'day', output_field=models.DateField()),
        'day'
    )
)

这里td将是整数。