Перевод вложенного запроса 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/