Sql 如何在Django ORM中从多个表中进行选择?

Sql 如何在Django ORM中从多个表中进行选择?,sql,django,select,orm,Sql,Django,Select,Orm,我有两个表,oneup\u backend\u design和Django的默认值auth\u user。 第一个表有以下列(简化):人类可读的\u id,管理者,工作者。工作列包含来自auth\u user的username 因此,我想在一次查询中获得与用户名关联的工作人员的人类可读\u id加上名字和姓氏。在原始SQL中,它将如下所示: 选择d.human\u readable\u id、u.first\u name、u.last\u name 从oneup\u后端\u设计为d,将用户身份验

我有两个表,
oneup\u backend\u design
和Django的默认值
auth\u user
。 第一个表有以下列(简化):
人类可读的\u id
管理者
工作者
。工作列包含来自
auth\u user
username

因此,我想在一次查询中获得与
用户名
关联的工作人员的
人类可读\u id
加上
名字
姓氏
。在原始SQL中,它将如下所示:

选择d.human\u readable\u id、u.first\u name、u.last\u name
从oneup\u后端\u设计为d,将用户身份验证为u
其中d.worker=u.username;
我努力阅读了docs和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)

假设您的模型是
BackendDesign
,并且您有
ForeignKey
工作者到
User
,那么:

BackendDesign.objects.select_related(
    'worker',
).only(
    'human_readable_id',
    'worker__first_name',
    'worker__last_name',
)
如果这没有帮助,请阅读django文档中的
extra()

我是新来的,但希望这将有助于

假设您的型号是
后端设计
,并且您有
外键
工作人员到
用户
,那么:

BackendDesign.objects.select_related(
    'worker',
).only(
    'human_readable_id',
    'worker__first_name',
    'worker__last_name',
)
如果这没有帮助,请阅读django文档中的
extra()

我是新来的,但希望这会有所帮助

我强烈建议将
工作者
变成
外键
,例如,参考
用户
模型的
用户名
字段:

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,
        to_field='username'
    )
您可以使用缩小获取的列的范围,但除非这些列包含大量数据,否则最好包含这些列

您还可以使用
从相关模型中获取值。注释(..)

从django.db.models导入F
Design.objects.annotate(
first\u name=F('worker\u first\u name'),
last\u name=F('worker\u last\u name')
)

在这里,来自此查询集的
设计
对象将有两个额外属性:
.first\u name
.last\u name
我强烈建议将
工作者
转换为
外键
,例如,引用
用户
模型的
用户名
字段:

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,
        to_field='username'
    )
您可以使用缩小获取的列的范围,但除非这些列包含大量数据,否则最好包含这些列

您还可以使用
从相关模型中获取值。注释(..)

从django.db.models导入F
Design.objects.annotate(
first\u name=F('worker\u first\u name'),
last\u name=F('worker\u last\u name')
)

此处,此查询集中的
设计
对象将有两个额外属性:
。名字
。姓氏

您是否有
外键
工作者
用户
?如果不是这样,那么这将是痛苦的。请在问题中添加
models.py
内容。此外,请注意,在Django中,您不应该考虑表格,而应该考虑模型。ORM的思想是,您不太关心表和查询,而是关心如何表示数据和有效地获取数据。@WillemVanOnsem:嗯,不。我没有从
worker
User
ForeignKey
。若真的很痛苦,那个么将原始SQL查询传递给数据库可能会更容易些?我不想用Django服务逻辑(身份验证系统和所有那些东西)污染
models.py
,这将很难维护。@ehsanahmadi:更新了问题
worker
User
你有
外键吗?如果不是这样,那么这将是痛苦的。请在问题中添加
models.py
内容。此外,请注意,在Django中,您不应该考虑表格,而应该考虑模型。ORM的思想是,您不太关心表和查询,而是关心如何表示数据和有效地获取数据。@WillemVanOnsem:嗯,不。我没有从
worker
User
ForeignKey
。若真的很痛苦,那个么将原始SQL查询传递给数据库可能会更容易些?我不想用Django服务逻辑(auth系统和所有那些东西)污染
models.py
,这将很难维护。@ehsanahmadi:更新了问题谢谢Przemysław,但不幸的是
User
是默认的Django
auth_User
表。我刚刚读了
extra()
将被弃用,请尝试
BackendDesign.objects.raw('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')
谢谢Przemysław,但不幸的是,
user
是默认的Django
auth_user
表。我刚刚读到了
extra()
将被弃用,因此请尝试
BackendDesign.objects.raw('SELECT d.human\u readable\u id,u.first\u name,u.last\u name FROM oneup\u backend\u design as d,auth\u user as u其中d.worker=u.username')