gpt4 book ai didi

python - 在 Django JSONField 中过滤列表项

转载 作者:行者123 更新时间:2023-12-04 01:43:43 25 4
gpt4 key购买 nike

这是我正在处理的 Django 模型的简化版本。

class Course(models.Model):
infos = JSONField()

信息 JSONField 如下所示:

infos = {
category: "Maths",
students: [
{
name: "Alice",
result: 8
},
{
name: "Bob",
result: 12
}
]
}

# (students can have 0 -> n items)

我正在尝试获取在任何类(class)中至少获得 10 分的所有学生的列表(结果 >= 10)。但是,我在想出一种相应地过滤 QuerySet 的方法时遇到了麻烦。

我正在尝试做这样的事情:

(Course.objects.filter(students__result__gte=10)
.values_list('students', flat=True))

但是由于 students 是一个列表,我无法直接访问每个项目的结果属性。此外,我认为它不会从结果中排除“Alice”对象。

我想得到这样的结果:

items = [
{
name: "Bob",
result: 12
}
]

如果有一种方法可以链接筛选的学生和类(class)类别,则加分:

items = [
{
category: "Maths",
students: [
{
name: "Bob",
result: 12
}
]
}
]

我怎样才能达到预期的结果?

最佳答案

通过使用原始 SQL,我设法获得了结果。

select array_to_json(array_agg(students_array))
FROM
course_table,
json_array_elements(CAST(course_table.infos->>'students' as json)) students_array
WHERE
CAST(students_array->>'result' as integer) >= 10
;

结果

sample_db=# SELECT version();
PostgreSQL 10.12 (Ubuntu 10.12-0ubuntu0.18.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit

sample_db=# select infos from course_table;
{"category": "Maths", "students": [{"name": "Alice", "result": 8}, {"name": "Bob", "result": 12}]}
{"category": "Science", "students": [{"name": "Jerin", "result": 8}, {"name": "George", "result": 12}]}
{"category": "Physics", "students": [{"name": "Vivek", "result": 17}, {"name": "Osama", "result": 6}]}

sample_db=# select array_to_json(array_agg(students_array))
sample_db-# FROM
sample_db-# course_table,
sample_db-# json_array_elements(CAST(course_table.infos->>'students' as json)) students_array
sample_db-# WHERE
sample_db-# CAST(students_array->>'result' as integer) >= 10
sample_db-# ;
[{"name": "Bob", "result": 12},{"name": "George", "result": 12},{"name": "Vivek", "result": 17}]

这个原始 SQL 可以由 Django 执行,

raw_sql = """
select 1 as id, array_to_json(array_agg(students_array)) as result
FROM
course_table,
json_array_elements(CAST(course_table.infos->>'students' as json)) students_array
WHERE
CAST(students_array->>'result' as integer) >= 10
;
"""
qs = Course.objects.raw(raw_sql)
for i in qs:
print(i.result)

关于python - 在 Django JSONField 中过滤列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56242369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com