【问题标题】:How to Return Hours or Minutes from Django Annotation and F Expression如何从 Django 注释和 F 表达式返回小时或分钟
【发布时间】:2019-10-01 16:54:03
【问题描述】:

我有一个模型如下:

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 类型的 days 而不是 timedelta 对象?

【问题讨论】:

    标签: django django-models django-rest-framework django-filter


    【解决方案1】:

    您可以尝试使用标准 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)
    

    【讨论】:

    • 感谢@wencakisa,这确实有效。我正在寻找一种使用 Django ORM 中的 EXTRACT() 的方法,您给出了确切的解决方案。
    • @MKJ 我很高兴能帮上忙。 :)
    • 你也可以回答这个问题吗? stackoverflow.com/questions/56631679/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多