【发布时间】:2015-12-19 15:24:17
【问题描述】:
我正在尝试根据两个DateTimeFields 的时间差来获取帖子,例如,发布后不到 10 分钟内被删除的帖子。
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)
【问题讨论】:
-
您是否尝试过使用
models.DateTimeField()作为输出字段? -
@LaundroMat @omat 可能是
models.DurationField。 -
是的,“DurationField”有效。非常感谢。
标签: django django-orm django-aggregation