Django在不使用预取相关的情况下获取同级词典?

2024-05-29 01:42:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个模型如下,并有一个男孩名单。我怎样才能得到他们每个姐妹的名单? 不幸的是,我不能使用预取相关的,因为我坚持使用一个非常旧的版本的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: [ .. ] }

提前感谢您的帮助!你知道吗


Tags: name模型modelmodelslengthmaxclassparent
1条回答
网友
1楼 · 发布于 2024-05-29 01:42:02

首先,得到一份所有男孩父母的名单,然后用这个名单把所有女孩和那些父母联系在一起。你知道吗

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,您将得到额外的查询来获取每个家长的女孩。你知道吗

相关问题 更多 >

    热门问题