我的模型与以下相同:
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 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
;
这里,
json_test
是表名data
是包含数组数据的列名