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_date
:get_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()
))
我正在尝试查询所有过期的预订,但我没有 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_date
:get_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()
))