Аннотирование и сравнение 2 подсчетов для результатов подзапроса

Я пытаюсь получить 2 подсчета связанной таблицы для сравнения, чтобы я мог вывести различные коды состояния на основе этого сравнения.

Проблема в том, что я не могу получить более одного подсчета, так как count сам нетерпеливо оценивает запрос, и я получаю ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.

Это запрос modelmanager:

        class SuccessCode(Enum):
            SUCCESS = "Success"
            PARTIAL = "Partial"
            FAILURE = "Failed"

        completed = MyModel.objects.filter(
            backup=OuterRef("pk")
        ).completed()
        unsuccessful = (
            MyModel.objects.filter(backup=OuterRef("pk"))
            .completed()
            .filter(model_field__isnull=False)
        )
        return (
            self.active()
            .annotate(complete=Subquery(completed.count()))
            .annotate(unsuccessful=Subquery(unsuccessful.count()))
            .annotate(
                success=Case(
                    When(
                        complete=F("unsuccessful"),
                        then=Value(SuccessCode.FAILURE),
                    ),
                    When(unsuccessful=0, then=Value(SuccessCode.SUCCESS)),
                    default=Value(SuccessCode.PARTIAL),
                )
            )
        )

Так что мне нужно 2 подсчета - завершенные и неуспешные (неуспешные по определению будут подмножеством завершенных - где угодно от 0 до всех завершенных записей). Затем мне нужно сравнить эти значения.

Есть советы?

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