Объект F, не работающий с JSONField, был задокументирован здесь вместе с обходным решением кто-то разместил в комментариях :
class KeyTextTransformFactory:
def __init__(self, key_name):
self.key_name = key_name
def __call__(self, *args, **kwargs):
return KeyTextTransform(self.key_name, *args, **kwargs)
class JSONF(F):
def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False):
rhs = super().resolve_expression(query, allow_joins, reuse, summarize, for_save)
field_list = self.name.split(LOOKUP_SEP)
for name in field_list[1:]:
rhs = KeyTextTransformFactory(name)(rhs)
return rhs
Необходимоinclude Cast в rhs,
Sample.objects.filter(jsonfield__lookup__value=Cast(JSONF('value'),
IntegerField()))
Пропущенный импорт из вышеупомянутого поста:
from django.db.models.functions import Cast
from django.db.models import CharField
from django.contrib.postgres.fields.jsonb import KeyTextTransform
И переменная LOOKUP_SEP
, вероятно, должна быть '__'
.
Как говорится, я попробовал это, и это работает для вашего случая аннотации.Кроме того, возможно, что Cast
не требуется, если тип, который вы ожидаете, не является чем-то отличным от str
, я использовал его с и без Cast на строковом значении в JSONField, и он, казалось, работал должным образом.Не знаю, почему автор решил написать класс KeyTextTransformFactory
, поскольку вы можете просто позвонить KeyTextTransform(name, rhs)
напрямую.