首页 > 解决方案 > 如何使用'select_related'从查询集中的多个模型中获取数据?

问题描述

我正在尝试为两个模型获取组合查询集,基本上是两个表的 LEFT JOIN。

我阅读了有关如何在查询集上执行 LEFT JOIN 的多个答案,我发现最简单的方法是通过 select_related,所以这就是我所做的。

当我打印原始查询时,它看起来不错,它包含来自两个表(两个模型)的信息。

然而,返回的查询集仅包含来自第一个模型的信息。我读到这是默认设置,它可以被 get_query 覆盖。这就是我迷失的地方,因为文档只为基于类的视图提供了 get_query 描述,到目前为止我只使用基于函数的视图。

这些是我的模型:

    class WorkPlace(models.Model):
        workplace   = models.TextField(unique=True)
        nickname    = models.TextField(null=True)

        def __str__(self):
            return f'{self.workplace}'

    class Status(models.Model):
        workplace   = models.OneToOneField(WorkPlace, to_field="workplace", db_column="workplace", on_delete=models.SET_NULL, null=True)
        status      = models.TextField()

        def __str__(self):
            return f'{self.status}'

这是视图:

    def work_place_list_view(request):
        qs1 = WorkPlace.objects.select_related('status')
        print(qs1.query)
        context = {"workplace_list": qs1, "title": "Seznam pracovišť"}
        template_name = 'megavisor/workplace_list.html'
        return render(request, template_name, context) 

这是来自控制台的原始查询:

SELECT "megavisor_workplace"."id", "megavisor_workplace"."workplace", "megavisor_workplace"."nickname", "megavisor_status"."id", "megavisor_status"."workplace", "megavisor_status"."status" FROM "megavisor_workplace" LEFT OUTER JOIN "megavisor_status" ON ("megavisor_workplace"."workplace" = "megavisor_status"."workplace")

输出是仅包含来自 WorkPlace 类模型的信息的查询集。我还需要它包含来自 WorkPlaceStatus 类的模型的信息。

标签: pythondjangopostgresqldjango-models

解决方案


在工作场所添加相关名称。

 workplace   = models.OneToOneField(WorkPlace,  related_name="work", to_field="workplace", db_column="workplace", on_delete=models.SET_NULL, null=True)

然后,使用这个查询,

qs1 = WorkPlace.objects.select_related('work')

而且,您不能status在 select_related 中使用,因为您的外键是workplace.


推荐阅读