python - 从静态字段生成的 Django F 日期表达式
问题描述
我正在尝试从人员列表中获取一系列年龄,但是每个查询产生的年龄都会发生变化,因为是特定事件中的年龄,所以我可以通过一个简单的循环来完成此操作,从差异中提取时间增量:
[ (event_date - user.birth_date).days/365.25 for user in User.objects.all() ]
event_date 始终是 datatime.date 对象和 user.birth_date 。我认为它是“静态”字段或常量,因为它位于数据库之外。
这给了我正确的结果,但是由于我多次这样做并且我还有其他计算要做,所以我想使用 F() 表达式从数据库中生成年龄。
``from django.db.models import ExpressionWrapper, fields
diference = ExpressionWrapper(
event_date- F('birth_date'),
output_field=fields.DurationField())
qs_ages= self.annotate(age_dist=diference)
这应该给我一个名为 age_dist 的字段,它将是一个 timedelta 包含两个日期之间的总天数,所以现在我应该这样做并且应该给我与上面相同的结果。
[ User.objects.all() 中的用户的 user.age_dist.days/365.25 ]
但这不起作用,结果是微秒的时间增量我做错了什么?以及我应该如何将 event_date 的静态值包含到表达式中?
而且……超越。有什么方法可以从 ExpressionWrapper 获取结果时间增量的天数?
解决方案
因为您正在对 datetime 对象进行操作,所以当您使用 DurationField 作为输出字段时,它将返回一个 datetime 对象,该对象将转换为 timedelta 微秒。
您可以通过在数据库中执行所有操作来解决此问题:
age = ExpressionWrapper(
Cast((event_date.date() - F('birth_date')) / 365.25 ,output_field=fields.PositiveIntegerField()),
output_field=fields.PositiveIntegerField()
)
推荐阅读
- r - 从 dplyr 到 base:为变量的每个级别创建第一个和最后一个索引的数据框
- git - 将发布分支合并到 master 后,release 仍然显示为在 master 之前提交了这么多提交
- spring - “对于没有 MD5 摘要元数据的上传 InputStream,markSupported() 方法必须评估为真。” 在 Spring 集成 AWS
- javascript - 如何创建可以在表列中包含键值对的数据库?
- python - 将哈希和文件名添加到列表和字典
- python - 使用 leidenalg 和 igraph 查找簇,然后输出 gml 文件
- node.js - nodeJS typescript的中间件中未定义req.headers
- php - 如何用 smarty 渲染 Html
- docker - 将 Docker 与官方 Progress OpenEdge RDBMS 映像一起使用
- regex - Regex a portion of string with a specific patten