4

私の提案モデルは次のように定義されています。

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

    # (extra fields clipped for brevity's sake)

各プロポーザルオブジェクトに注釈を付けて、scheduled_time+期間のtimedelta表現で計算された「end」日時を指定し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()F()式を使用してこの種のことは可能ですか?

編集:注釈の目的は、計算された終了時間をフィルタリング/除外できるようにすることです。

4

2 に答える 2

1

F()-expressions は、django でのみ機能します (特定のオブジェクトのインスタンスを返すため)。それらをtimedeltaなどに渡すことはできませんが、djangoクエリセットメソッドの一部を除きます。

したがって、モデルに新しいフィールドを追加することをお勧めします。

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()

save メソッドをオーバーライドする

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 に答える