Django 在不使用预取相关的情况下获取兄弟姐妹的字典?
Django get dictionary of siblings without using prefetch related?
我有如下三个模型,并且有一个男孩列表。我怎样才能得到他们每个姐妹的名单?
不幸的是,我无法使用预取相关,因为我使用的是非常旧的 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: [ .. ] }
在此先感谢您的帮助!
首先,获取所有 parent 男孩的列表,然后用它来获取所有 parent 的女孩。
boys = Boy.objects.all()
parents = boys.values_list('parent_id', flat=True)
girls = Girl.objects.filter(parent__in=parents)
然后建立一个女孩字典 parent
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
,您将获得额外的查询来获取每个 parent 的女孩。
我有如下三个模型,并且有一个男孩列表。我怎样才能得到他们每个姐妹的名单? 不幸的是,我无法使用预取相关,因为我使用的是非常旧的 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: [ .. ] }
在此先感谢您的帮助!
首先,获取所有 parent 男孩的列表,然后用它来获取所有 parent 的女孩。
boys = Boy.objects.all()
parents = boys.values_list('parent_id', flat=True)
girls = Girl.objects.filter(parent__in=parents)
然后建立一个女孩字典 parent
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
,您将获得额外的查询来获取每个 parent 的女孩。