Из SQL в Django без использования необработанного метода
Я пытаюсь преобразовать SQL Query в Django. Я новичок в Django и мне трудно делать простые вещи, вот SQL запрос, который я пытаюсь выполнить с помощью Django :
SELECT *
FROM balance_hold bh1
WHERE
bh1.account_balance = X and
bh1.hold_id in (
SELECT hold_id
FROM balance_hold bh2
WHERE
bh2.transaction_id = bh1.transaction_id and
bh2.account_balance = X and
(
bh2.release_time = null and hold_type >=
(select * from balance_hold bh3 where bh3.transaction_id = bh2.transaction_id and bh3.account_balance = X and bh3.release_time = null)
) or
(
bh2.release_time != null and bh2.release_time >= (select release_time from balance_hold bh3 where bh3.transaction_id = bh2.transaction_id and bh3.account_balance = X and bh3.release_time != null)
))
как мне запустить это с Django (без использования метода RAW!)?
Я не думаю, что попытка перевести sql запрос в django ORM является правильным способом решения вашего вопроса, независимо от этого вам понадобится несколько инструментов для достижения этой цели.
OR и AND могут быть записаны с помощью объектов Q (https://docs.djangoproject.com/fr/4.1/ref/models/querysets/#operators-that-return-new-querysets).
Вид подзапроса может быть достигнут с помощью Subquery и OuterRef(https://docs.djangoproject.com/fr/4.1/ref/models/expressions/#subquery-expressions).
#column = null может быть достигнуто с помощью __isnull поиска (https://docs.djangoproject.com/fr/4.1/ref/models/querysets/#isnull)
Если не понятен синтаксис подзапросов, например:
BalanceHold.objects.filter(account_balance=X, id__in=Subquery(BalanceHold.objects.filter(transaction_id=OuterRef("transaction_id")).values("id")))
Производит:
SELECT * FROM "balance_hold" WHERE ("balance_hold"."id" IN (SELECT U0."id" FROM "balance_hold" U0 WHERE U0."transaction_id" = "balance_hold"."transaction_id") AND "balance_hold"."account_balance" = X) ORDER BY "balance_hold"."id" DESC