Множественные аннотации Count в фильтрации Django вызывают ProgrammingError

Я запускаю страницу поиска на модели, которая имеет две связанные модели с отношением ManyToMany (ForeignKey).

class Session(models.Model):
    ...
    fields
    ...

class Tuition(models.Model):
    session = models.ForeignKey(Session, on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

    ...

class Housing(models.Model):
    session = models.ForeignKey(Session, on_delete=models.CASCADE)
    ...

Я хотел бы фильтровать по совокупным подсчетам этих двух моделей.

Для Housing это простой Count, я хочу отфильтровать по наличию жилья для этой сессии (также как если housing_count__gt=0)

queryset.annotate(housing_count=Count('housing', distinct=True))

Для Tuition я включаю фильтр в Count, потому что я хочу учитывать и те, где цена указана, и те, где она нулевая. И, таким образом, я хочу снова отфильтровать сессии, где только хотя бы одно занятие с этой ценой (или одной нулевой ценой) связано. (tuition_count__gt=1)

queryset = queryset.annotate(tuition_count=Count('tuition', filter=Q(Q(tuition__price__lte=max_tuition_passed) | Q(tuition__price__isnull=True)), distinct=True))

** Однако я продолжаю сталкиваться с проблемой, **кажется, особенно с tuition_count (я пробовал комментировать по одному/обоим за раз).

Ошибка программирования в функции /search/programs/summer-intensives count(integer, boolean) не существует LINE 1: ...ECT COUNT(*) FROM (SELECT "session". "id" AS Col1, COUNT(DIST... ^ СОВЕТ: Ни одна функция не соответствует заданному имени и типу аргументов. Вам может понадобиться добавить явное приведение типов.

Я пробовал исследовать это и тестировать потенциальные решения. Наиболее ярким из них, которое я помню, было следующее:

Похоже, что запуск нескольких .annotate() может быть проблемой, особенно с графом. Наиболее часто предлагаемым решением было добавление distinct=True, но это не помогло мне решить проблему.

Любая помощь будет очень признательна, большое спасибо!

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