Перевод вложенного запроса SQL в Django ORM

У меня нет большого опыта работы с Django ORM. Мне поручили создать команду на основе Django, которая будет выполнять SQL-запрос, но я понятия не имею, как вложенное приложение будет переведено в нотацию ORM.

Есть ли способ сделать это читабельным способом, или использование "сырого" оператора является более разумным подходом? Любая помощь будет очень признательна.

update main_connection mc
set test_case_count = 0, test_case_fail_count = 0, status_id = 3
where not mc.test_case_count = (
    select count(*) 
    from test_results_testcase trt 
    where trt.connection_id = mc.id
)

Вы можете создать аннотацию, которая подсчитывает, затем отфильтровать по этой аннотации, а затем обновить

qs1 = MainConection.objects.annotate(test_results_count=Count('test_result_testcase'))
qs2 = qs1.filter(test_results_count=0)
qs2.update(test_case_count=0, test_case_fail_count=0, status_id=3)

Такие кверисеты могут быть выполнены в одной строке.
После агрегирования вы можете фильтровать по нему.\

А обновление изменит значения всего набора запросов после фильтра (qs2)

Не видя кода, я не могу точно сказать, как сделать Count(), но в документации есть примеры, которые должны вам помочь. https://docs.djangoproject.com/en/4.0/topics/db/aggregation/

Вернуться на верх