Bobsans
@Bobsans
Full-Stack Developer

Можно ли описать такой запрос PostgreSQL при помощи Django ORM синтаксиса?

Доброго времени суток.

Есть задача при запросе в бд проверять актуальность объекта. Запрос выглядит вот так:
SELECT
    r.id, r.created, r.modified,
    (COUNT(upd.id)::integer)::boolean AS has_updates,
    (r.created > (
        STATEMENT_TIMESTAMP() - CONCAT(
            COALESCE((SELECT s.value FROM system_settings s WHERE s.name = 'actuality_period'), '10'), 
            ' days'
        )::interval)
    )::boolean AS is_actual
FROM records_record r
    LEFT OUTER JOIN record_recordupdate upd ON (r.id = upd.record_id)
WHERE r.source = 'GAO'
GROUP BY r.id
ORDER BY r.modified DESC;


На Django пробовал что-то типа вот этого:
period = IntervalDays(Coalesce(
    Subquery(Settings.objects.filter(name='actuality_period').values('value')), 
    Value('10'))
)
Record.objects\
    .annotate(has_updates=Cast(Cast(Count('record_updates'), IntegerField()), BooleanField()))\
    .annotate(is_actual=Cast(F('created') > Now() - period, BooleanFields()))

но операторы '>', '<' и т.п. не работают здесь.
Можно ли каким-либо образом преобразовать данный запрос чтобы его можно было описать при помощи Django ORM?
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
is_actual=Case(
    When(created__gt=Value(now()) - F(period)), then=True),
    default=False
)

Суть в том что почти все линейные неравенства в таких условиях приводятся к виду {переменная} < {выражение}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы