如何从 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)
我有一个模型如下:
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)