Ошибка запроса 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

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