python - 如何使用'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 类的模型的信息。
解决方案
在工作场所添加相关名称。
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
.
推荐阅读
- ansible - 通过分析列表项值将字符串添加到列表(如果 item=='valor' 则将字符串添加到列表中)
- r - 贝叶斯二独立样本检验。产生错误缺失值 TRUE/FALSE 和 NaN
- sql - Hive 查询以获取美国联邦假期
- mysql - 错误:函数 avg(boolean) 不存在(MySql > PostgreSQL 转换)
- python - 适合熊猫数据框中的所有行,然后仅根据数据进行转换
- jekyll - Wordpress 导出到 Jekyll - 无法找出帖子的索引链接
- c# - C# JSON.net 在反序列化时没有正确地将对象创建为字典中的值
- java - 如何查询 CursorLoader?
- r - 使用大于第 9 行的两个变量从 data.frame 中查找第 N 行
- uiview - 反复隐藏和显示另一个 UIViewController 的视图