为queryset中的每个实例设置FK

时间:2012-12-10 11:27:54

标签: python django

我有一个类似于树的Django模型,名为A,由django-mptt完成。

class A(MPTTModel):
    parent = TreeForeignKey('self')

这个班自动拥有'儿童'经理,所以我可以轻松获得子树

还有另一个模型,它有FK链接到A:

class SomeModel(models.Model):
    link_to_a = models.ForeignKey(A)

我知道,如果我想获得一个A实例的SomeModel,我可以这样做:

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()应为每个子项检索ziped的集合查询集

2 个答案:

答案 0 :(得分:1)

您是否只需要一个列表中的相关项目,或者您是否需要将每个集合与其父项相关联?如果是前者,你可以一次性获得它们:

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')

答案 1 :(得分:0)

这应该做:

[child.somemodel_set.all() for child in some_A_instance.children.all()]