Аннотировать одну часть диапазона в новое поле - PullRequest
0 голосов
/ 26 июня 2018

Итак, мы использовали DateTimeRangeField в модели бронирования для обозначения начала и конца. Объяснение этому могло бы быть не очень хорошим - отдельные ретроспективные поля могли бы быть лучше в ретроспективе - но сейчас у нас на это больше года, и пути назад нет.

Обычно это нормально, за исключением того, что мне нужно аннотировать только дату и время окончания на запрос связанной модели. И я не могу понять синтаксис.

Вот небольшой игрушечный пример, в котором я хочу получить список сотрудников с аннотацией окончания их последнего бронирования.

class Booking(models.Model):
    timeframe = DateTimeRangeField()
    employee = models.ForeignKey('Employee')

sq = Booking.objects.filter(employee=OuterRef('pk')).values('timeframe')
Employee.objects.annotate(last_on_site=Subquery(sq, output_field=DateTimeField()))

Это не работает, потому что аннотированное значение является диапазоном, а не единственным значением. Я пробовал кучу модификаторов (например, __1 .1, но ничего не работает).

Есть ли способ получить только одно значение? Я думаю, вы могли бы смоделировать это без усложнения подзапроса, просто выполнив простой поиск значений. Booking.objects.values('timeframe__start') (или что угодно). По сути, это то, что я пытаюсь сделать здесь.

1 Ответ

0 голосов
/ 27 июня 2018

Благодаря некоторой помощи в IRC оказывается, что вы можете напрямую использовать классы преобразования RangeStartsWith и RangeEndsWith. Это те вещи, которые обычно просто регистрируются, чтобы предоставить вам __startswith фильтр доступа к значениям диапазона, но они напрямую могут отозвать значение.

В моем примере это означает лишь незначительное изменение аннотации:

from django.contrib.postgres.fields.ranges import RangeEndsWith
sq = Booking.objects.filter(employee=OuterRef('pk')).values('timeframe')
Employee.objects.annotate(last_on_site=RangeEndsWith(Subquery(sq[:1])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...