2

我有如下三个模型,并有一个男孩列表。我怎样才能得到他们每个姐妹的名单?不幸的是,我无法使用相关的预取,因为我被困在使用非常旧版本的 django 中。

class Parent(model.Model):
    name = models.CharField(max_length=50)

class Boy(model.Model):
    parent = models.ForeignKey(Parent)
    name = models.CharField(max_length=50)

class Girl(model.Model):
    parent = models.ForeignKey(Parent)
    name = models.CharField(max_length=50)

所需的输出将是这样的:

{ boy1: [ sister1, sister2 ], boy2: [ .. ] }

提前感谢您的帮助!

4

1 回答 1

3

首先,获取男孩所有父母的列表,并使用该列表来获取所有女孩与这些父母。

boys = Boy.objects.all()
parents = boys.values_list('parent_id', flat=True)
girls = Girl.objects.filter(parent__in=parents)

然后建立一个由父母键入的女孩字典

from collections import defaultdict
girls_by_parent = defaultdict(list)
for girl in girls:
    girls_by_parent(girl.parent_id) = girl

然后,您可以为每个男孩构建最终的姐妹词典:

sisters = { boy.pk: girls_by_parent[boy.parent_pk] for boy in boys } 

如果你可以使用prefetch_related,你可以做类似的事情:

boys = Boy.objects.select_related('parent').prefetch_related('parent__girl')
sisters = {b.pk: b.parent.girls_set.all() for b in boys}

没有prefetch_related你会得到额外的查询来为每个父母获取女孩。

于 2018-04-09T14:29:26.853 回答