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

ifmq2ha2  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(206)

我想根据外键对模型对象进行分组,可以使用查询,也可以不使用任何迭代。
我有一个模型 student :

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

在这里我要创建组 student object 关于 parentId 使用查询或任何优化方式。

nsc4cvqm

nsc4cvqm1#

尝试使用defaultdict

from collections import defaultdict

    students = defaultdict(list)
    for result in Student.objects.order_by('parentId'):
        students[result.parentId].append(result)
ecr0jaav

ecr0jaav2#

如果按外键对元素排序,则可以使用 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'))
]

或者如果你想为你的Map编一本字典 parent 对象添加到 Student 学生:

result = {
    k: list(v)
    for k, v in grouby(
        Student.objects.prefetch_realted('parentId').order('parentId_id'),
        attrgetter('parentId')
    )
}

这将生成一个列表列表,其中在每个子列表中, student 他和我一样 parentId 被分组在一起。
请注意 ForeignKey 他们通常没有 _id ,或 Id 后缀。因此,您可能需要将模型更改为:

class Student(models.Model):
    parent = models.ForeignKey()
    name = models.CharField()
    age = models.IntegerField()

相关问题