如何从 Django 注释和 F 表达式 Return 小时或分钟

How to Return Hours or Minutes from Django Annotation and F Expression

我有一个模型如下:

class LeaveViewSet(viewsets.Model):
    def get_queryset(self):
        Leave.objects.annotate(duration=ExpressionWrapper(
            F('end_date') - F('start_date') + timedelta(days=1)
        ))

class Leave(models.Model):
    start_date = models.DateField()
    end_date = models.DateField()

但是当我查询 Leave 并尝试访问带注释的字段时 duration 我得到 timedelta 对象,例如:

leave = Leave.objects.all().first()
leave.duration.days    # this gives duration in days
leave.duration         # this is how I want to get the value

然后我在模型中添加了一个 属性 如下:

class LeaveViewSet(viewsets.Model):
    def get_queryset(self):
        Leave.objects.annotate(leave_duration=ExpressionWrapper(
            F('end_date') - F('start_date') + timedelta(days=1)
        ))

class Leave(models.Model):
    start_date = models.DateField()
    end_date = models.DateField()

    @propery
    def duratioin(self):
        return self.leave_duration.days

这样序列化程序也可以正常工作,我可以访问 leave.duration 但想知道我是否可以在注释字段中获取 int 类型的天数而不是 timedelta 对象?

您可以尝试使用标准 Django 库中的 ExtractDay

from django.db.models import F
from django.db.models.functions import ExtractDay

# ...

def get_queryset(self):
    duration_expression = F('end_date') - F('start_date') + timedelta(days=1)
    duration_wrapper = ExpressionWrapper(duration_expression)
    duration_days = ExtractDay(duration_wrapper)

    return Leave.objects.annotate(leave_duration=duration_days)