簡體   English   中英

如何在django模型中從今天減去日期

[英]how to subtract a date from today in django model

模型.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

在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>

我正在嘗試使用 models.py 中的 rest_of_the_day 函數存儲結束日期並在 html 文件中顯示結束日期的剩余天數

例如:如果結束日期是 30-01-2010 而今天是 15-01-2020,我希望 rest_of_the_day 顯示 15

但是,我在 / 不支持的操作數類型處收到TypeError for -: 'NoneType' 和 'datetime.date'

似乎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模板過濾器 [Django-doc]

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

這使得處理某個日期(時間)發生之前的時間量變得更加方便。

另一種選擇是在查詢中使用數據庫函數將列添加到 QuerySet 結果。

這里 QuerySet 結果中的每個活動對象都將具有datetime.timedelta類型的td列。

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對象,只有幾天我們還需要將日期和日期時間之間的計算轉換為一種類型/輸出字段。

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

請注意,您將操作datetime.timedelta對象。 此外,在不同部分( Now()F('enddate')whole expression 、不同組合)上添加Trunc可能會由於天數的四舍五入和減去方式而產生略有不同的結果。 你可以試驗一下。

要將結果作為整數(提取功能可以添加到組合中:

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

這里td將是整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM