Django ORM Cast() возвращает строку с двойными кавычками из поля JSON
Мне нужно аннотировать значение, которое сохраняется в json-поле в той же модели. (Не самый умный вариант, но что есть, то есть).
Я аннотирую значение следующим образом:
class SomeModel(BaseModel):
reference_numbers = JSONField(blank=True, null=True)
SomeModel.objects.annotate(
reference=Cast(
F("reference_numbers__some_id"),
output_field=models.CharField(),
)
)
Мне нужно, чтобы в запросе он приводился к text/char, потому что последующий поиск будет работать только по text/char (триграммное сходство).
Это работает, вроде как, но результат добавляет лишнюю кавычку к моей строке. Например, так:
queryset[0].reference -> ' "666999"'
Есть идеи, как получить правильную строку из запроса?
Я также пробовал использовать просто ExpressionWrapper с полем вывода, но поскольку он не приводит тип в SQL, код ломается при попытке выполнить поиск, потому что он по-прежнему использует поле jsonb.
У меня была та же проблема, и после некоторых исследований я обнаружил, что правильным способом сделать это, похоже, является KeyTextTransform
. Возможно, вам подойдет следующий вариант:
from django.db.models.fields.json import KeyTextTransform
SomeModel.objects.annotate(
reference=KeyTextTransform("some_id", "reference_numbers")
)
Если схема доступа становится более сложной, возможно, вам придется вложить их, см. здесь.
Также существует выражение запроса KT, которое появилось в Django 4.2 и позволяет использовать более глубокие шаблоны доступа.