【问题标题】:Django annotate date with timedelta and increaseDjango用timedelta注释日期并增加
【发布时间】:2021-02-04 15:03:39
【问题描述】:

我正在尝试查询所有过期的预订,但我没有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')) 所以你知道timedeltadays 将参数类型作为整数但传递了这个导致错误的itinerary__days

在这种情况下有人可以帮助我吗?

【问题讨论】:

    标签: django django-rest-framework django-orm


    【解决方案1】:

    在 postgres 中你可以这样尝试:

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

    【讨论】:

    • 谢谢,您的帮助让我过上了好日子
    • @howrecepes 更新我的答案.. 如果这不是您要查找的内容,请取消标记
    猜你喜欢
    • 2019-10-28
    • 2020-04-10
    • 2018-12-30
    • 2019-09-24
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2012-03-18
    相关资源
    最近更新 更多