Django 注释 ExpressionWrapper 没有 Return 预期类型

Django Annotate ExpressionWrapper Does not Return Expected Type

我有以下型号:

class Creditor(models.Model):
    terms_of_payment = models.IntegerField(
        blank=False,
        null=False
    )

class Invoice(models.Model):
    creditor = models.ForeignKey(
        Creditor,
        blank=False,
        null=False,
        on_delete=models.CASCADE
    )
    reception_date = models.DateField(
        blank=True,
        null=True
    )

我正在从以下查询集中为 due_on 获取类型 int,而不是 datetime.date 并且无法弄清楚原因。

invoices = Invoice.objects.annotate(
    due_on=ExpressionWrapper(
        F('reception_date') + F('creditor__terms_of_payment'),
        output_field=DateField()
    )
)

我使用的数据库是MySQL。 所以基本上如果 reception_date=datetime.date(2021, 5, 13)terms_of_payment=2,我希望得到 datetime.date(2021, 5, 15) 但我得到 2021515<class 'int'>.

我终于找到了解决办法。问题是 terms_of_paymentIntegerField 而不是 DurationField。为了使此查询集产生 datetime,始终应将 DurationField 添加到 DateTimeField。这些对应于 datetime.datetimedatetime.timedela in Python.

class Creditor(models.Model):

    terms_of_payment = models.DurationField(
        default=datetime.timedelta(days=30)
    )