【问题标题】:Extract nested value from a Django jsonfield从 Django jsonfield 中提取嵌套值
【发布时间】:2017-04-12 12:44:10
【问题描述】:

有没有办法查询一个对象,从JSONField 字段中“提取”一段嵌套数据,然后将其作为每个查询集实例上的自定义临时字段提供?

在我的用例中,我将来自 Twitter 的 API 的溢出元数据存储在 data 字段中以供以后使用。我希望能够访问TwitterPost.data 内的嵌套字段followers_count

我已阅读有关如何根据嵌套值进行过滤的文档,但没有阅读如何在生成查询集时将其提取为临时字段。

同样,我已阅读 annotate 文档以了解创建自定义临时字段的方法,但示例都在简单字段上使用聚合函数,因此不是 JSONFields

提前感谢您的任何建议。

示例模型:

from django.contrib.postgres.fields import JSONField

class TwitterPost(models.Model):
    id = models.IntegerField()
    data = JSONField()

data 字段的示例 JSON 值:

{
  'followers_count': 7172,
  "default_profile_image": false,
  "profile_text_color": "000000"
}

我想做的伪代码:

TwitterPost.objects.annotate(followers_count=instance.data.followers_count)

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    这可能是一个迟到的答案,但有办法做到这一点

    from django.contrib.postgres.fields.jsonb import KeyTransform
    
    TwitterPost.objects.annotate(followers_count=KeyTransform('followers_count', 'data'))
    

    可以使用或 KeyTextTransform 代替 KeyTransform(用于转换为字符串)

    【讨论】:

    • 是的,这是在更高版本的 Django (1.11 IIRC) 中添加的,自从提出这个问题后我就一直在使用它。感谢您将答案留给未来的搜索者。
    • 我相信 KeyTextTransform 的参数顺序是 (json_key_name, jsonfield_name),所以应该是KeyTextTransform('followers_count', 'data')
    【解决方案2】:

    如果你想访问 JSONField 中的数据,你必须使用 __。在您的示例中,它将是这样的

    TwitterPost.objects.annotate(followers_count=instance.data__followers_count)
    

    查看文档here

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 2019-07-28
      • 1970-01-01
      • 2021-10-07
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多