Сгруппируйте объект django по внешнему ключу - PullRequest
0 голосов
/ 18 октября 2018

Я хочу сгруппировать объект модели по внешнему ключу с запросом или без какой-либо итерации.

пример: Пусть у меня есть модель 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 голосов
/ 18 октября 2018

Попробуйте использовать defaultdict

    from collections import defaultdict

    students = defaultdict(list)
    for result in Student.objects.order_by('parentId'):
        students[result.parentId].append(result)
0 голосов
/ 18 октября 2018

Если вы заказываете элементы по внешнему ключу, то вы можете использовать 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 s с одинаковыми parentId сгруппированы вместе.

Обратите внимание, что ForeignKey s обычно имеют суффикс no _id или Id.Поэтому вы можете изменить модель на:

class Student(models.Model):
    <b>parent</b> = models.ForeignKey()
    name = models.CharField()
    age = models.IntegerField()
...