Django запрос, который фильтрует по вычисляемым полям, ищет символ в строке - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть django модель, которая описывает циклический статус между двумя датами. Это выглядит примерно так:

class OnCallCycle(models.Model):
    crew = models.ForeignKey(Crew, on_delete=models.CASCADE)
    start = models.DateField()
    end = models.DateField()
    cycle = models.CharField(max_length=255)

, где start и end - включающая дата начала и окончания цикла, а cycle - строка, представляющая цикл состояния вызова по одному символу на день. Например, если у вас был 12-дневный цикл, в котором были включены первые 6 дней (представлены P), а последние 6 дней были выключены (представлены N, cycle будет выглядеть так: PPPPPPNNNNNN Если число дней между start и end превышает длину цикла, оно повторяется. Таким образом, с учетом экземпляра OnCallCycle, occ, можно вычислить состояние вызова по данной дате, d (известно, что между start и end):

delta = (d-occ.start).days
status = occ.cycle[delta % len(occ.cycle)]

Есть ли способ сделать это в запросе на определенную дату, d? Я хотел бы сделать что-то вроде этого:

active_cycles = OnCallCycle.objects.filter(
    start__lte=d,
    end__gte=d
).filter(
    # Find all OnCallCycles where the cycle status for date d is not 'N'
)

Я использую Postgres для своей базы данных, если что-то изменится. Есть мысли?

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете использовать фильтр регулярных выражений, чтобы получить определенный статус. Выражение должно быть примерно таким: ^.{8}P, где 8 - это позиция, а P - буква, которую вы хотите найти.

Однако я бы предложил закодировать состояние в битах. Регулярные выражения имеют тенденцию отличаться между поставщиками базы данных и версией, что делает их причудливыми. Если вы решили поиграть с битами, проверьте это: Как выполнять побитовые запросы к БД в Django?

...