我正在尝试使用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')
我应该怎么做呢?
提前致谢。
答案 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_related
和Project.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])