Как вернуть часы или минуты из аннотации Django и выражения F - PullRequest
0 голосов
/ 14 мая 2019

У меня есть модель, как указано ниже:

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 в аннотированном поле?

1 Ответ

1 голос
/ 14 мая 2019

Вы можете попробовать использовать ExtractDay из стандартной библиотеки Django:

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)
...