【问题标题】:Django ORM INNER JOINDjango ORM 内连接
【发布时间】:2014-02-16 19:12:53
【问题描述】:

我无法使用 Django ORM 执行此查询。 如何进行内部连接,如何进行此查询并仅返回我想要的列?

SELECT     establecimiento.nombre, categoria.titulo
FROM         establecimiento INNER JOIN
                      categoria ON establecimiento.categoria = categoria.id

【问题讨论】:

  • 你能展示你的模型定义吗?如果您在两个模型之间声明了正确的 ForeignKey 字段,这非常简单。
  • 如何在 Django 中进行简单的 INNER JOIN,因为我在 sql 中进行了此操作,但无法在 Django 中进行此查询,如何使用 Django ORM 中的两个模型
  • 我不是刚刚回答了这个问题here吗?

标签: python django orm django-models


【解决方案1】:

根据您回复 pdxwebdev 的评论中的信息(您声明了一个外键字段),这很简单。 Django 自动化了外键关系所需的大部分连接行为。

要精确复制该查询,包括从连接中仅选择两个字段,valuesvalues_listonly 中的任何一个都应该根据您想要返回的 Python 对象来执行此操作。例如,这是一个使用values 检索字典的可迭代查询集的查询:

Establecimiento.objects.values('nombre', 'categoria__titulo')

values_list 将检索元组而不是字典,only 将检索Establecimiento 实例,其中除这两个之外的所有模型字段都被延迟(它们尚未从数据库中检索,但将根据需要进行查找)。

当你使用__ 来遵循这样的外键关系时,Django 会自动进行内连接。

您也可以在查询集上使用select_related 来要求它进行连接,即使您不检索特定字段也是如此。例如:

Establecimiento.objects.select_related('categoria')

这应该产生一个SELECT * from ... 的查询,并返回一个Establecimiento 实例的查询集,这些实例的categoria 数据已经加载到内存中。

【讨论】:

    【解决方案2】:

    我不确定我是否理解这个问题。 establecimiento.categoria 只需要成为分类模型的外键字段即可。 categoria.id 是主键,所以这将自动完成。

    要只返回某些列,只需要 .only() 方法。

    https://docs.djangoproject.com/en/dev/ref/models/querysets/#only

    【讨论】:

    • 我有两个模型:Establecimiento 和 Categoria,Establecimiento 模型有一个 ForeignKey(Categoria)。然后我想显示 Establecimiento 的名称和关系的类别名称。
    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 2020-05-21
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2020-05-18
    • 2011-12-15
    相关资源
    最近更新 更多