OuterRef 在 django 中如何工作?

Moh*_*ail 12 django django-orm

我无法理解 django ORM 中的 OuterRef 到底是如何工作的。例如:

    Table.objects.filter(field=OuterRef("pk"))
Run Code Online (Sandbox Code Playgroud)

这是什么意思?field和在这里扮演什么角色pk以及它如何影响最终的查询集?请有人详细说明一下。提前致谢。

Eli*_*les 4

需要理解的是,OuterRef 的行为取决于使用查询的上下文。

以你的例子为例:

Table.objects.filter(field=OuterRef("pk"))
Run Code Online (Sandbox Code Playgroud)

您可以将其理解为“过滤表TableTable.field等于外部查询上下文主键的行”。

它本身并不能转化为完整的 SQL 查询,但它在 SQL 查询上下文中的含义如下:

SELECT pk, ... FROM ... WHERE ...(SELECT * FROM Table WHERE field = pk)
^^^^^^^^^^^^^^^^^^                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outer query                       this is the part that corresponds to
                                  Table.objects.filter(field=OuterRef("pk"))
Run Code Online (Sandbox Code Playgroud)

通常,您将在处理行子集的上下文中使用它(Exists例如,使用像 之类的运算符),或者添加 alimit 1以便在与某些字段进行比较时使用单个结果。

在 Django ORM 中,您需要Table.objects.filter(field=OuterRef("pk"))[:1]获取子查询的单个结果。