我有一个树状的Django模型,名为A,由django-mptt完成。
class A(MPTTModel):
parent = TreeForeignKey('self')
这个类自动具有"子"管理器,所以我可以轻松获取子树
还有另一个模型,它有 FK 链接到 A:
class SomeModel(models.Model):
link_to_a = models.ForeignKey(A)
我知道,如果我想获得 A 实例的某个模型集,我可以这样做:
a = A.objects.filter(blah)
a.somemodel_set.all()
问题是:在 A 模型下获取某个查询集中每个实例somemodel_set的最 pythonic 方法是什么,即我想要 4 个示例:
some_A_instance.children.all().get_all_somemodel_instances()
和 get_all_somemodel_instances() 应该为每个子级检索集合的压缩查询集
您只需要一个列表中的相关项,还是需要将每个集与其父项相关联?如果是前者,您可以通过以下方式一次获得它们:
related_items = SomeModel.objects.filter(link_to_a=some_A_instance.children.all())
这将执行一个查询(带有子查询)来获取所有内容。
否则,您可以使用 prefetch_related()
一次性获取所有项目的相关集:
items = some_A_instance.children.all().prefetch_related('somemodel_set')
这应该可以:
[child.somemodel_set.all() for child in some_A_instance.children.all()]