Ошибка запроса Django JSONField: оператор не существует: jsonb = bigint
Допустим, у меня есть 2 таблицы A
и B
. Таблица B
имеет поле JSON с именем preferences
, которое содержит поле с id таблицы A
под названием a_id
.
Я хочу подсчитать количество строк B, которые относятся к строкам таблицы A
следующим образом:
A.objects.annotate(count=Count(B.objects.filter(preferences__a_id=OuterRef('id'))))
Однако я получаю ошибку operator does not exist: jsonb = bigint
. Согласно этому ответу, я должен иметь возможность ссылаться на атрибуты полей JSON, используя два подчеркивания (__
) между именами. Почему это не работает в моем случае?
Кроме того, ниже ошибки есть сообщение:
HINT: Ни один оператор не соответствует заданному имени и типу аргументов. Вам может потребоваться добавить явное приведение типов.
Но я не понимаю, к чему это относится. Я пробовал приводить OuterRef(id)
к целому числу через выражение Cast()
, но это ничего не меняет.
Вам нужно явно привести preferences.a_id
к явному типу, потому что это jsonb
на PostgreSQL, а не int
решение
from django.db import models
from django.db.models.functions.comparison import Cast
A.objects.annotate(count=Count(B.objects.annotate(casted_id=Cast("preferences__a_id", models.IntegerField())).filter(casted_id=OuterRef('id'))))
используется Django 4.1