I have a single model with a jsonb field. There is a value inside this jsonb field that can be shared amongst other rows. I am trying to get the count of a subquery while filtering by this jsonb field.
Some pseudo code of what I have been attempting borrowing examples from this post.
alpha_qs = MyModel.objects.filter(class_id="ALPHA")
# unnest jsonb field so I can leverage it via OuterRef
alpha_qs = alpha_qs.annotate(nested_value_id=KeyTextTransform("nested_value_id", "a_jsonb_field"))
related_beta_subquery = MyModel.objects.filter(class_id="BETA", a_jsonb_field__nested_value_id=OuterRef("nested_value_id"))
related_beta_subquery_count = related_beta_subquery.annotate(count=Count("*")).values("count")
alpha_qs = alpha_qs.annotate(related_beta_count=Subquery(related_beta_subquery))
Using this example data I would expect the top instance to have a related_beta_count
of 2
because there are two associated betas with the same nested_value_id
.
{
"class_id": "ALPHA",
"a_jsonb_field": {
"nested_value_id": 'abc'
}
}
{
"class_id": "BETA",
"a_jsonb_field": {
"nested_value_id": 'abc'
}
}
{
"class_id": "BETA",
"a_jsonb_field": {
"nested_value_id": 'abc'
}
}
{
"class_id": "BETA",
"a_jsonb_field": {
"nested_value_id": 'zyz'
}
}
I've been getting an error below but haven't been able to resolve it.
ProgrammingError: operator does not exist: jsonb = text
LINE 1: ...d AND (U0."a_jsonb_field" -> 'nested_value_id') = ("my_model...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.