Django:使用带有get()和filter()的prefetch_selected

时间:2015-08-11 14:14:15

标签: django python-3.x django-queryset

我正在尝试使用prefetch_selected进行查询以预取多个对象。 在执行 all()查询时使用prefetch_selected可以正常工作,但我不知道我应该如何使用 get() filter()< / em>的。这是我的模特:

class Project(models.Model):
    …
    funders = models.ManyToManyField(Organization, related_name="funders")

class Organization(models.Model):
    …
    name = models.CharField(max_length=200, unique=True)

尝试下面的行似乎不起作用:

Project.objects.get(id=project_id).select_related('funders')

Project.objects.filter(id__in=[‘list-of-ids]).select_related('funders')

我应该怎么做呢?

提前致谢。

3 个答案:

答案 0 :(得分:1)

你以错误的顺序将它们链接起来,这样做:

Project.objects.select_related('funders').get(id=project_id)

Project.objects.select_related('funders').filter(id__in=[‘list-of-ids])

您必须在经理对象(select_related)上致电prefetch_relatedProject.objects

答案 1 :(得分:1)

<Context docBase="MyApp" path=""> 是一个查询集方法。 querysets上的文档包含两个方法部分:返回新查询集的方法,以及不返回查询集的方法。 select_related()位于第二部分,因此您无法在其后链接任何其他查询集方法。

另一件事:get()为每个模型运行一个额外的查询。由于您只提取单个项目,prefetch_related()将运行1个查询来获取所有相关组织,无论您使用project.funders.all()。当您需要多个项目的相关组织时,prefetch_related()会变得非常有用。

答案 2 :(得分:0)

由于资助者是m2m你不能使用select_related,你必须我们预取。 select_related仅适用于外键和一对一关系

Project.objects.prefetch_related('funders').filter(id__in=[id1, id2])