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
是默认的Djangoauth_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
是默认的Djangoauth_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')