【问题标题】:How can I do a Django Query on a JSONField containing a date?如何对包含日期的 JSONField 执行 Django 查询?
【发布时间】:2019-03-22 15:11:43
【问题描述】:

我希望我能做这样的事情:

Q(data__result_started__gt = dateutil.parser.parse("5/22/18"))

Q(data__result_started__gt = "2018-5-22")

在第一种情况下,我得到一个 datetime is not JSON serializable 错误,在第二种情况下,我得到 0 个结果返回。

有没有办法做到这一点? 谢谢

【问题讨论】:

  • 开始:您正在比较文本。 json 中没有日期类型。如果this (note: postgres specific) 不起作用,我可以建议在 postgres 中创建一个视图,提供从 json(或 jsonb)中提取的 id 和日期。

标签: python json django postgresql


【解决方案1】:

您不能使用 __gt 后缀来过滤 json 子字段。这在 django ORM 中尚不支持。可以使用 postgresql 中的原始 sql 来执行此操作,因此可能会在 Django 的未来版本中添加此功能。

如果您提供模型代码,有人可能会使用 sql 提出答案。

您还可以使用.annotate() 提取子字段,然后在后续的 django QuerySet 查询中使用它。有关示例,请参阅此问题。

Ordering Django querysets using a JSONField's properties

【讨论】:

  • 您确定 __gt 后缀吗?我正在做类似 data__build_version__gt=1.5 的事情,这似乎有效
  • 如果可能的话,一些实现可能已经在最近的 django 版本中到位,但尚未记录。所以我怀疑这是部分实现,这就解释了为什么日期比较不起作用。
  • 尝试使用 django json 编码器日期格式:Q(data__result_started__gt = "2018-05-22T00:00:00")。或仅日期,但对日期和月份使用零填充。
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 2017-02-21
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多