5

DateTimeFieldたとえば、投稿後 10 分以内に削除された投稿など、2 つの s の時間差に基づいて投稿を取得しようとしています。

class Post(models.Model):
    ...
    time_posted = models.DateTimeField()
    time_deleted = models.DateTimeField(blank=True, null=True)

上記のモデルを手にして、試してみました。

from datetime import timedelta

Post.objects.exclude(deleted__isnull=True).annotate(
    delta=F('time_deleted') - F('time_posted')
).filter(delta__lt=timedelta(minutes=10))

を取得しましたTypeError: expected string or buffer。次に、タイプの変更(DateTimeオブジェクトがTimeオブジェクトを生成する)である可能性があると考えたので、次のように試しましたExpressionWrapper

Post.objects.exclude(deleted__isnull=True).annotate(
    delta=models.ExpressionWrapper(
        F('time_deleted') - F('time_posted'), 
        output_field=models.TimeField())
    ).filter(delta__gt=timedelta(minutes=10))

しかし、これも同じ例外を引き起こしました。

どんな助けでも大歓迎です。

編集

@ivanの提案によると、DurationField()代わりに試しました。例外は発生しなくなりましたが、デルタは常に0.

>>> post = Post.objects.exclude(deleted__isnull=True).annotate(
        delta=ExpressionWrapper(F('deleted') - F('time'), 
        output_field=DurationField())
    ).first()
>>> post.time_posted
datetime.datetime(2015, 8, 24, 13, 26, 50, 857326, tzinfo=<UTC>)
>>> post.time_deleted
datetime.datetime(2015, 8, 24, 13, 27, 30, 521569, tzinfo=<UTC>)
>>> post.delta
datetime.timedelta(0)
4

1 に答える 1