Django 用 timedelta 注释日期并增加

Django annotate date with timedelta and increase

我正在尝试查询所有过期的预订,但我没有 end_date 等任何字段,我有 start_date 和总数 itinerary__days.

这是我的查询:

import datetime
from django.db.models import Avg, Count, Min, Sum, FloatField, ExpressionWrapper, F, DateTimeField

trip = Booking.objects.annotate(
    end_date=ExpressionWrapper(
        F('start_date') + datetime.timedelta(days=F('itinerary__days')),
        output_field=DateTimeField()
    )
)

这些是我的模型:

class Itinerary(models.Model):
    days = models.PositiveSmallIntegerField(_("Days"), null=True, blank=True)


class Booking(models.Model):
    itinerary = models.ForeignKey(
        Itinerary,
        on_delete=models.CASCADE
    )
    start_date = models.DateField(_("Start Date"), null=True, blank=True)

    def get_end_date(self):
        return self.start_date + datetime.timedelta(days=self.itinerary.days)

你可能已经注意到我有一个方法可以得到end_dateget_end_date()

这就是为什么我要尝试注释以获取结束日期并根据结束日期进行查询以获取过期预订。

在我的查询中,您可能会注意到这一行:DateTime.timedelta(days=F('itineraray__days')) 所以你知道 timedelta 天将参数类型作为整数但传递了这个 itinerary__days 导致了错误。

谁能帮我解决这个问题?

在 postgres 中你可以这样尝试:

qs = Booking.objects.annotate(
    end_date=ExpressionWrapper(
        F('start_date') + Cast(F("itinerary__days"), output_field=IntegerField()),
    output_field=DateField()
))