gpt4 book ai didi

Django:如何在distinct()之后过滤()

转载 作者:行者123 更新时间:2023-12-04 05:40:15 24 4
gpt4 key购买 nike

如果我们在调用 distinct() 之后链接对 filter() 的调用,则过滤器将应用于 distinct 之前的查询。应用distinct后如何过滤查询结果?
Example.objects.order_by('a','foreignkey__b').distinct('a').filter(foreignkey__b='something')
filter() 产生的 SQL 中的 where 子句意味着过滤器应用于不同的查询之前。我想过滤由不同产生的查询集。

这可能很容易,但我无法完全弄清楚,也找不到任何内容。

编辑1:

我需要在 ORM 中执行此操作...
SELECT z.column1, z.column2, z.column3
FROM (
SELECT DISTINCT ON (b.column1, b.column2) b.column1, b.column2, c.column3
FROM table1 a
INNER JOIN table2 b ON ( a.id = b.id )
INNER JOIN table3 c ON ( b.id = c.id)
ORDER BY b.column1 ASC, b.column2 ASC, c.column4 DESC
) z
WHERE z.column3 = 'Something';

(顺便说一下,我正在使用 Postgres。)
所以我想我要问的是“你如何在 ORM 中嵌套子查询?这可能吗?”我会检查文档。

抱歉,如果我之前没有具体说明。我脑子里不太清楚。

最佳答案

这是一个老问题,但是在使用 Postgres 时,您可以执行以下操作来强制对“Distinct”行进行嵌套查询:

foo = Example.objects.order_by('a','foreign_key__timefield').distinct('a')
bar = Example.objects.filter(pk__in=foo).filter(some_field=condition)

bar 是 OP 中要求的嵌套查询,无需求助于原始/额外等。在 1.10 中进行了测试,但文档建议它至少应恢复到 1.7。

我的用例是过滤反向关系。如果 Example 有一些外键来模拟 Toast 那么你可以这样做:
Toast.objects.filter(pk__in=bar.values_list('foreign_key',flat=true))

这为您提供了所有 Toast 实例,其中最新的关联示例符合您的过滤条件。

关于性能的重大健康警告,使用这个 if bar 可能是一个巨大的查询集,你可能会过得很糟糕。

关于Django:如何在distinct()之后过滤(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24150162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com