@romaarv

Как перевести запрос с SQL на Django ORM?

Помогите с конвертацией SQL запроса на Django ORM:

count_limit = 10
content_type = ContentType.objects.get_for_model(Task)

last_tests = Task.objects.raw("\
SELECT task.id, task.lesson_id, task.name, task.content, task.max_score, MAX (log.action_time) AS modified_at\
FROM main_task task, django_admin_log log\
WHERE task.is_active=True AND log.content_type_id=%d AND task.id=CAST(log.object_id AS INTEGER)\
GROUP BY task.id, log.object_id ORDER BY modified_at DESC LIMIT
%d\
" % (content_type.id, count_limit)
)

Я вытаскиваю с LogEntry события связанные с таблицей (Task) и по task.id показываю последнее событие в LogEntry - кто последний модифицировал запись через админку, а если первое событие - это создатель записи.
Таблица LogEntry стандартная.
Спасибо
  • Вопрос задан
  • 360 просмотров
Пригласить эксперта
Ответы на вопрос 1
@romaarv Автор вопроса
так ладно, решил разобраться.
Построил такой ОРМ:
count_limit = 10
content_type = ContentType.objects.get_for_model(Task)
last_tests = Task.objects.filter(is_active=True).annotate(modified_at=Subquery(
LogEntry.objects.filter(content_type_id=content_type.id, object_id=str(OuterRef('pk')),).order_by(
'-action_time').values('action_time')[:1]
)).order_by('-modified_at')[:count_limit]
Вот его SQL:
SELECT "main_task"."id", "main_task"."lesson_id", "main_task"."name", "main_task"."max_score", "main_task"."content", "main_task"."is_active",
(SELECT U0."action_time"
FROM "django_admin_log" U0
WHERE (U0."content_type_id" = 11 AND U0."object_id" = OuterRef(pk))
ORDER BY U0."action_time" DESC LIMIT 1) AS "modified_at"
FROM "main_task"
WHERE "main_task"."is_active" = True
ORDER BY "modified_at" DESC LIMIT 10

В итоге поле modified_at пустое. Конструкция OuterRef работает вообще?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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