【发布时间】:2020-03-14 07:13:14
【问题描述】:
我有一个模型,叫它Foo,它有一个属性created_at,它记录了创建实例的时间(UTC)。
我想用自创建返回的每个项目以来的秒数来注释此模型上的查询集。
(更准确地说,我想根据项目的打开时间“打折”项目,并使用可配置的过期时间,但如果我能得到自创建以来的秒数,我可以进行该计算)
我已经尝试了一些显而易见的事情,比如
Foo.objects.annotate(time_since_create=now-F('created_at'))
和
Foo.objects.annotate(time_since_create=now.timestamp()-F('created_at'))
(其中now isutc.localize(datetime.utcnow())`)
但是这些让我知道AttributeError: 'float' object has no attribute 'tzinfo',这表明日期上的 DB 算术比我想象的要复杂一些。
显然,我可以在python中做这个算术,即,
[(id, now-created_at) for id, created_at in Foo.objects.values_list("id", "created_at")]
但如果我能在查询集中得到它会更好。
【问题讨论】:
-
datetime.now()-F('created_at')怎么样?您是否有理由要注释查询集?通常渲染数据是模板的职责,不是查询集的职责。 -
@WillemVanOnsem 在我的示例中,
now是utc.localize(datetime.utcnow())。编辑问题以明确这一点 -
但是你为什么使用
.timestamp()?然后将其转换为float。如果你使用now - F('created_at')会怎样? -
@WillemVanOnsem 我都试过了(见帖子中的例子)
-
在这种情况下,您可能应该测试然后接受下面@Durai 的回答。那应该为你做。显然,如果你想要一个通用的查询集,你需要在最后删除 values() 调用
标签: django date django-queryset