【问题标题】:Filtering in Django against a JsonField which is a JsON Array with dates values in it在 Django 中针对 JsonField 进行过滤,该 JsonField 是一个 JsON 数组,其中包含日期值
【发布时间】:2021-08-23 07:40:31
【问题描述】:

我在 Django 中有一个模型,其中有一个名为 periodicityJsonField,它像这样在 Json 数组中序列化:

{
  "id_series": 12381,
  "country_name": "Central African Republic",
  "periodicity": [
    {
      "period": "monthly",
      "start_date": "2010-10-01",
      "end_date": "2018-10-01"
    },
    {
      "period": "weekly",
      "start_date": "2011-10-01",
      "end_date": "2018-01-01"
    }
  ]
},
{
...
}

所以我的目标是过滤并找到在特定日期内未更新的系列。为此,我需要查询内部 Json 数组的 end_date。进行过滤的最佳方法是什么?

我尝试通过这样做将end_date 转换为日期对象:

from django.db.models.expressions import RawSQL
Serie.objects.annotate(endDate=RawSQL("((periodicity->>'end_date')::date)", [])).filter(endDate__gte=comparisonDate)

但到目前为止还没有产生任何结果。我正在研究类似https://stackoverflow.com/a/65184218/2219080.

【问题讨论】:

    标签: json django postgresql


    【解决方案1】:

    可以使用类似的逻辑,通过JSON_ARRAY_ELEMENTS()函数提取periodicity数组的元素,并通过TO_DATE()进行过滤,例如

    SELECT t.jsdata ->> 'id_series' AS id_series, 
           t.jsdata ->> 'country_name' AS country_name,
           j.value ->> 'period' AS period
      FROM t,
           JSON_ARRAY_ELEMENTS(jsdata->'periodicity') AS j
     WHERE TO_DATE(j.value->>'end_date','YYYY-MM-DD') >=  '2018-01-01'
    

    Demo

    【讨论】:

    • 谢谢。我会尽快试用并通知您。
    • 不客气@iMitwe,好好学习
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 2016-07-23
    • 2019-03-22
    • 2018-04-09
    • 2021-04-03
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多