Django ORM Cast()从JSON字段返回双引号字符串

fjnneemd  于 2023-04-07  发布在  Go
关注(0)|答案(1)|浏览(156)

我需要注解保存在同一模型中的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(三元组相似性)起作用。
它可以工作,但结果会给我的字符串添加一个额外的引号。像这样:
查询集[0].reference -〉'“666999”'
如何从查询中获得正确的字符串?
我还尝试过只使用ExpressionWrapper和output字段,但由于它没有强制转换SQL中的类型,因此在尝试执行搜索时代码会中断,因为它仍然使用jsonb字段。

e4eetjau

e4eetjau1#

我也遇到了同样的问题,经过一些研究,我发现正确的方法似乎是KeyTextTransform。以下可能对你有用:

from django.db.models.fields.json import KeyTextTransform

SomeModel.objects.annotate(
    reference=KeyTextTransform("some_id", "reference_numbers")
)

如果您的访问模式变得更加复杂,您可能需要嵌套它们,请参阅here
Django 4.2中还有一个名为KT的查询表达式,它允许更深层次的访问模式。

相关问题