它可以在django queryset中的两个日期之间获得几个月?

时间:2018-04-16 12:06:55

标签: django python-3.x postgresql

我正在尝试创建一个完整的查询集,现在我只需要从模型中获取两个DateTime字段之间的月份,就可以在单个查询集中执行此操作。 我不是在谈论过滤器,因为在模型中我有两个datetimeField(),现在我想要做的是,在这些日期之间得到几个月。

2 个答案:

答案 0 :(得分:3)

如果您的数据库支持DurationField,则可以使用ExtractMonth

from django.db import models
from django.db.models.functions import ExtractMonth

queryset = MyModel.objects.annotate(
    diff=models.ExpressionWrapper(
        models.F('date1') - models.F('date2'), output_field=models.DurationField())
    ).annotate(months=ExtractMonth('diff'))

答案 1 :(得分:0)

在postgres上给出的答案对我不起作用,因为diff字段(DurationField)仅支持Extract天的功能。 ExtractMonth返回“ 0”。

这是我找到的解决方案:

queryset = MyModel.objects.annotate(
    months=(ExtractYear("date2") - ExtractYear("date1")) * 12 + (ExtractMonth("date2") - ExtractMonth("date1"))
)

请注意,它仅考虑每个月的第一天之间的差异,而不考虑各天的最终分数。在此解决方案中,2020-08-12被视为与2020-08-01相同。