4

我的提案模型定义如下:

class Proposal(models.Model):
    scheduled_time = models.DateTimeField()
    duration = models.IntegerField() # stores minutes as an integer

    # (extra fields clipped for brevity's sake)

我想注释每个提案对象,给它一个由 schedule_time + 持续时间的 timedelta 表示计算的“结束”日期时间,例如timedelta(minutes=duration)。但是, F() 表达式似乎不能作为timedelta().

>>> from datetime import timedelta
>>> from django.db.models import F
>>> from schedule.models import Proposal
>>>
>>> proposals = Proposal.objects.all()
>>> annotated = proposals.annotate(
...     end=F('scheduled_time')+timedelta(minutes=F('duration')))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: unsupported type for timedelta minutes component: F
>>>

annotate()使用and F() 表达式可以实现这种事情吗?

编辑:注释的目的是能够过滤/排除计算的结束时间。

4

2 回答 2

1

F()-expressions 仅适用于 django(因为它们返回特定对象的实例)。除了某些 django 查询集方法之外,您不能将它们传递给 timedelta 或其他任何东西。

所以你最好为你的模型添加新字段:

class Proposal(models.Model):
    scheduled_time = models.DateTimeField()
    duration = IntegerField()
    end = models.DateTimeField(default=self.scheduled_time + timedelta(minutes=self.duration))
于 2012-08-06T21:22:26.387 回答
1

正如@Daniil 已经指出的那样, F() 不能那样使用。

一个可能的解决方案是添加一个新字段

end_time = models.DateTimeField()

并覆盖保存方法

def save(self, *args, **kwargs):
    if not self.end_time:
        self.end_time = self.scheduled_time + datetime.timedelta(self.duration)
    super(Proposal, self).save(*args, **kwargs)
于 2013-03-15T11:48:58.243 回答