【问题标题】:Which ORM syntax to join three tables in Django?在 Django 中连接三个表的 ORM 语法是什么?
【发布时间】:2020-09-18 02:42:50
【问题描述】:

我的 Django 项目中有以下三个模型(表):

class Tool(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)
    name = models.CharField(db_column='Name', unique=True, max_length=50)

class Flow(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)
    Toolid = models.ForeignKey(Tool, models.DO_NOTHING, db_column='ToolId')
    name = models.CharField(db_column='Name', unique=True, max_length=50)

class Task(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)
    name = models.CharField(db_column='Name', max_length=50)
    FlowId = models.ForeignKey('Flow', models.DO_NOTHING, db_column='FlowId')

我想进行 ORM 查询,将工具、流程和任务的所有信息一起返回,这些信息彼此相关(即 SQL 查询中的 JOIN 方法)。例如,我想得到这样的东西:

[
 { Tool name: ...
   Flow name: ...
   Task name: ...
 }
 { Tool name: ...
   Flow name: ...
   Task name: ...
 }
 ...
 ...
]

你知道我应该写什么 ORM 语句来得到那个输出吗? 我真的很想从所有三个表(不仅仅是其中两个)中得到结果!

如果您向我提供与我上面提供的表格相关的语法,我们将不胜感激。

非常感谢!

【问题讨论】:

    标签: django django-models orm django-views django-queryset


    【解决方案1】:

    由于TaskFlow 有一个外键,而Tool 有一个外键,您应该能够在一个查询中检索它们,例如:

    task_flow_tool_tuple_list = Task.objects.all().values_list('name', 'FlowId__name', 'FlowId__Toolid__name')
    

    您使用“dunders”(双下划线)从一个模型链接到另一个模型,最后从链中的最后一个模型链接到您想要的属性。因此,我们选择了所有的 Task 对象,并为每个对象返回一个列表:

    • 任务名称
    • 任务的 FlowId 的名称
    • 任务的 FlowId 的 Toolid 的名称

    希望对您有所帮助,祝您编码愉快!

    【讨论】:

    • 谢谢!我是 ORM 的新手,这真的很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2010-10-01
    • 2020-05-18
    • 2022-01-18
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多