gpt4 book ai didi

sql - 如何在 Django ORM 中从多个表中进行 SELECT?

转载 作者:行者123 更新时间:2023-12-02 19:36:26 26 4
gpt4 key购买 nike

我有两个表,oneup_backend_design 和 Django 的默认auth_user。第一个表具有以下列(简化): human_ready_id manager worker 。 Worker 列包含来自 auth_user用户名

因此,我想在一个查询中获取与 username 关联的工作人员的 human_read_id 以及 first_namelast_name 。在原始 SQL 中,它看起来像这样:

SELECT d.human_readable_id, u.first_name, u.last_name
FROM oneup_backend_design as d, auth_user as u
WHERE d.worker = u.username;

我努力阅读文档和 Django ORM 食谱,但没有找到任何东西。这是一个如此简单的查询,我应该错过一些东西。如何通过单个数据库命中来实现这一目标?

UPD:models.py:

class Design(models.Model):
human_readable_id = models.CharField(max_length=10, default=id_generator, db_index=True)
manager = models.CharField(max_length=40)
worker = models.CharField(max_length=40, null=True)

最佳答案

我强烈建议将 worker 转换为 ForeignKey,例如引用 Userusername 字段> 型号:

from django.conf import settings

class Design(models.Model):
human_readable_id = models.CharField(max_length=10, default=id_generator, db_index=True)
manager = models.CharField(max_length=40)
worker = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
<b>to_field='username'</b>
)

这意味着 worker_id 将是一个 VARCHAR 字段,其中的 username 列具有 FOREIGN KEY 约束auth_user 表,它将有一个索引,可以实现快速连接。此外,它还保证了引用完整性:如果工作线程不为 NULL,则它引用 auth_user 对象的有效用户名

然后我们可以查询:

Design.objects<b>.select_related('worker')</b>

您可以使用.only() [Django-doc]缩小获取的列的范围,但除非这些列包含大量数据,否则最好包含这些列。

您还可以使用 .annotate(..) 从相关模型中获取值:

from django.db.models import F

Design.objects<b>.annotate(</b>
first_name=F('worker__first_name'),
last_name=F('worker__last_name')
<b>)</b>

这里,这个查询集中的Design对象将有两个额外的属性:.first_name.last_name

关于sql - 如何在 Django ORM 中从多个表中进行 SELECT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60997330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com