Множественные аннотации 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
, но это не помогло мне решить проблему.
Любая помощь будет очень признательна, большое спасибо!