Из 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
Вернуться на верх