Django JSONField过滤

ezd*_*kie 10 python django postgresql

我正在使用PostgreSQL和来自Django 1.9,JSONField的这个新领域.所以我得到了以下数据:

id|data
1 |[{'animal': 'cat', 'name': 'tom'}, {'animal': 'dog', 'name': 'jerry'}, {'animal': 'dog', 'name': 'garfield'}]
Run Code Online (Sandbox Code Playgroud)

我想弄清楚如何过滤这个json列表.我尝试过类似的东西:object.filter(data__contains={'animal': 'cat'}但我知道这不是那种方式.此外,我一直在考虑获取此值并在我的代码中过滤它:

[x for x in data if x['animal'] == 'cat']
Run Code Online (Sandbox Code Playgroud)

Air*_*ith 28

根据django JSONField文档,它解释了该data结构与python本机格式匹配,查询时采用略有不同的方法.

如果您知道JSON的结构,您还可以过滤密钥,就像它们是相关字段一样:

object.filter(data__animal='cat')
object.filter(data__name='tom')
Run Code Online (Sandbox Code Playgroud)

通过数组访问:

object.filter(data__0__animal='cat')
Run Code Online (Sandbox Code Playgroud)

您的包含示例几乎是正确的,但您的数据位于列表中并要求:

object.filter(data__contains=[{'animal': 'cat'}])
Run Code Online (Sandbox Code Playgroud)

  • 就是这样,谢谢!!还有一件事,我可以过滤日期吗?我得到了一个名为“start_date”的键,而不是“animal”,其中包含 ISO 8601 格式的日期 (2认同)
  • 是的,它有效......但只能访问元素数组`data__0__datetime__lte='2015-03-12'`。你有没有想过在整个列表中搜索的其他方式?谢谢你! (2认同)