【问题标题】:Django: Using prefetch_selected with get() and filter()Django:将 prefetch_selected 与 get() 和 filter() 一起使用
【发布时间】:2015-11-03 19:47:02
【问题描述】:

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

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

我该怎么做?

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    您必须在 Manager 对象 (Project.objects) 上调用 select_relatedprefetch_related

    【讨论】:

      【解决方案2】:

      select_related() 是一个查询集方法。 querysets 上的文档有两部分方法:返回新查询集的方法和不返回查询集的方法。 get() 在第二部分,所以你不能在它之后链接任何其他查询集方法。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-09-04
          • 2019-02-19
          • 1970-01-01
          • 2018-08-09
          • 2020-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多