根据外键对Django对象进行分组

时间:2018-10-18 08:18:48

标签: python mysql django django-models django-queryset

我想根据外键通过查询或不进行任何迭代将模型对象分组。

示例:让我有一个模型student

class Student(models.Model):
    id=models.AutoField(primary_key=True)
    parentId=models.ForeignKey(parent)
    name=models.CharField()
    age=models.IntegerField()

在这里,我想使用查询或任何优化方式针对student object创建一个parentId组。

2 个答案:

答案 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