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 为目标,其中键包含连字符/破折号