Skip to main content
 首页 » 编程设计

python之Django 在不使用预取相关的情况下获取 sibling 的字典

2024年08月16日33linjiqin

我有如下三个模型,并且有一个男孩列表。我怎样才能得到他们每个姐妹的名单? 不幸的是,我无法使用预取相关,因为我使用的是非常旧版本的 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 获取女孩。