Django:使用Func嵌套字典并应用过滤器

问题描述 投票:1回答:1

我的模型与以下相同:

class Work(models.Model):
    sub_items = ArrayField(JSONField(null=True), null=True, default=list)
    ...

sub_items存储中的数据如下:

[
    {
        "dt": 159565990,
        "task": {
            "description": "This is a task...",
            "progress": 75
        }
    },

    {
        "dt": 159565990,
        "task": {
            "description": "This is a task...",
            "progress": 100
        }
    },

    {
        "dt": 159565990,
        "task": {
            "description": "This is a task...",
            "progress": 80
        }
    },

    {
        "dt": 159565910,
        "task": {
            "description": "This is a task...",
            "progress": 100
        }
    },

    {
        "dt": 159565920,
        "task": {
            "description": "This is a task...",
            "progress": 100
        }
    },

    {
        "dt": 159565940,
        "task": {
            "description": "This is a task...",
            "progress": 20
        }
    },

    {
        "dt": 159565950,
        "task": {
            "description": "This is a task...",
            "progress": 50
        }
    },

    {
        "dt": 159565972,
        "task": {
            "description": "This is a task...",
            "progress": 10
        }
    },

    {
        "dt": 159565989,
        "task": {
            "description": "This is a task...",
            "progress": 100
        }
    },
]

每个数组项目在部门中都包含“ progress”键,我需要查询以获取所有进度等于100的项目。

我尝试通过使用以下查询来获取数据:

Work.objects.annotate(xyz=models.functions.Cast(models.Func(models.F('history'), function='unnest'), JSONField())).filter(xyz__message__progress=100)

但是django无法通过以下提示处理此查询:

*** django.db.utils.NotSupportedError:在WHERE中不允许使用set-turning函数第1行:...“ WHERE(” x_sub_items“。” status“ = 0 AND((unnest(” x _...

django postgresql django-orm
1个回答
0
投票

不使用Django ORM,但如果无法获得ORM结果,则可以使用此原始SQL

SELECT json_foo as result
FROM 
    json_test,
    json_array_elements(json_test.data::json) json_foo,
    cast(json_foo->>'task' as json) foo
WHERE CAST(foo->>'progress' as integer) > 70
;

这里,

  1. [json_test是表名
  2. data是包含数组数据的列名
© www.soinside.com 2019 - 2024. All rights reserved.