首页 > 解决方案 > 从静态字段生成的 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 获取结果时间增量的天数?

标签: pythondjangodjango-modelsdjango-querysetpython-datetime

解决方案


因为您正在对 datetime 对象进行操作,所以当您使用 DurationField 作为输出字段时,它将返回一个 datetime 对象,该对象将转换为 timedelta 微秒。
您可以通过在数据库中执行所有操作来解决此问题:

age = ExpressionWrapper(
            Cast((event_date.date() - F('birth_date')) / 365.25 ,output_field=fields.PositiveIntegerField()), 
            output_field=fields.PositiveIntegerField()
            )

推荐阅读