我想根据外键通过查询或不进行任何迭代将模型对象分组。
示例:让我有一个模型student
:
class Student(models.Model):
id=models.AutoField(primary_key=True)
parentId=models.ForeignKey(parent)
name=models.CharField()
age=models.IntegerField()
在这里,我想使用查询或任何优化方式针对student object
创建一个parentId
组。
答案 0 :(得分:1)
尝试使用defaultdict
from collections import defaultdict
students = defaultdict(list)
for result in Student.objects.order_by('parentId'):
students[result.parentId].append(result)
答案 1 :(得分:0)
如果通过外键对元素进行排序,则可以为此使用itertools.groupby
:
from itertools import groupby
from operator import attrgetter
result = [
list(v)
for __, v in grouby(Student.objects.order('parentId_id'), attrgetter('parentId_id'))
]
或者如果您想为将parent
对象映射到Student
s列表的位置创建字典:
result = {
k: list(v)
for k, v in grouby(
Student.objects.prefetch_realted('parentId').order('parentId_id'),
attrgetter('parentId')
)
}
因此,这将生成一个列表列表,其中在每个子列表中,具有相同student
的{{1}}个被分组在一起。
请注意,parentId
的后缀通常为 no ForeignKey
或_id
。因此,您可能需要将模型更改为:
Id