Django JSONField 过滤

Posted

技术标签:

【中文标题】Django JSONField 过滤【英文标题】:Django JSONField filtering 【发布时间】:2016-07-23 05:45:50 【问题描述】:

我正在使用 PostgreSQL 和 Django 1.9 中的这个新字段 JSONField。于是我得到了以下数据:

id|data
1 |['animal': 'cat', 'name': 'tom', 'animal': 'dog', 'name': 'jerry', 'animal': 'dog', 'name': 'garfield']

我试图弄清楚如何在这个 json 列表中进行过滤。我试过类似:object.filter(data__contains='animal': 'cat' 但我知道这不是办法。我也一直在考虑获取这个值并在我的代码中过滤它:

[x for x in data if x['animal'] == 'cat']

【问题讨论】:

您是否阅读了querying JSONField 上的综合文档?什么不清楚? 以上链接失效了。 Querying JSONfield now lives here. 【参考方案1】:

根据 Django JSONField docs,它解释说 data 结构与 python 原生格式匹配,查询时的方法略有不同。

如果您知道 JSON 的结构,您还可以对键进行过滤,就好像它们是相关字段一样:

object.filter(data__animal='cat')
object.filter(data__name='tom')

通过数组访问:

object.filter(data__0__animal='cat')

您的contains 示例几乎是正确的,但您的数据在列表中并且需要:

object.filter(data__contains=['animal': 'cat'])

【讨论】:

就是这样,谢谢!!还有一件事,我可以过滤日期吗?我得到了一个名为“start_date”的键,而不是“动物”,它包含 ISO 8601 格式的日期 我不认为你可以,因为它们只存储为字符串。我认为您必须提取所有日期,然后在 python 中进行比较。如果可能,您可以通过以下比较来测试它:data__datetime__lte=other_datetime 或任何其他查询快捷方式。 是的,它可以工作...但只能访问元素数组data__0__datetime__lte='2015-03-12'。您是否有其他方法可以在整个列表中进行搜索?谢谢! 有没有办法将日期过滤器应用于 JSON 字段?我试过data__time__date_lte=date.today()。但我收到一个错误Failed to handle exception Object of type Timestamp is not JSON serializable

以上是关于Django JSONField 过滤的主要内容,如果未能解决你的问题,请参考以下文章

Django:在过滤器和搜索中使用 JSONField 属性

Django 模型过滤器以 JSONField 为目标,其中键包含连字符/破折号

如何在 django rest 框架中的 postgres JSONField 上应用过滤器?

在 django rest 框架中更新 JSONField

Django JSONField 字符串包含

如何在 DJANGO 中查询包含值列表的 JSONField