【发布时间】:2019-10-08 02:08:10
【问题描述】:
这是我正在研究的 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)
我正在尝试获取在任何课程中至少获得 10 分的所有学生的列表(结果 >= 10)。 但是,我无法找到相应地过滤 QuerySet 的方法。
我正在尝试做这样的事情:
(Course.objects.filter(students__result__gte=10)
.values_list('students', flat=True))
但由于学生是一个列表,我无法直接访问每个项目的结果属性。此外,我认为它不会从结果中排除“Alice”对象。
我想得到这样的结果:
items = [
{
name: "Bob",
result: 12
}
]
如果有办法将过滤的学生和课程类别联系起来,则可以加分:
items = [
{
category: "Maths",
students: [
{
name: "Bob",
result: 12
}
]
}
]
我怎样才能达到预期的效果?
【问题讨论】:
-
你不知道学生人数,是吗?
-
我事先不知道那个数字,这意味着我不能通过索引来定位数组项。我没有为此找到任何“小丑”,例如:students__???__result__gte(其中 ??? 将在每个学生的循环中被替换)
-
我认为你不能使用 Django 的 ORM 来实现这一点。因为,当您使用“跨度”时(students__result__gte=8)。如果此条件返回 True,则将返回整行。我认为您应该在 python 方面对此进行排序。
-
你是对的,这是有道理的,因为这是过滤课程行而不是行内的学生列表。谢谢!
-
我建议使用
JSONField如果您的数据不适合使用常规关系建模的数据库。此外,您的数据结构似乎非常适合关系模型
标签: python django postgresql django-jsonfield