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 и позволяет использовать более глубокие шаблоны доступа.

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