Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:如何在distinct()之后筛选()_Django - Fatal编程技术网

Django:如何在distinct()之后筛选()

Django:如何在distinct()之后筛选(),django,Django,如果我们在调用distinct之后将调用链接到filter,那么过滤器将应用于distinct之前的查询。应用distinct后如何过滤查询结果 例如.objects.order_by'a','foreignkey_uub'。distinct'a.filterforeignkey_ub='something' 过滤器产生的SQL中的where子句意味着过滤器应用于distinct之前的查询。我想过滤由distinct生成的查询集 这可能很简单,但我就是不太明白,也找不到任何东西 编辑1: 我需要

如果我们在调用distinct之后将调用链接到filter,那么过滤器将应用于distinct之前的查询。应用distinct后如何过滤查询结果

例如.objects.order_by'a','foreignkey_uub'。distinct'a.filterforeignkey_ub='something'

过滤器产生的SQL中的where子句意味着过滤器应用于distinct之前的查询。我想过滤由distinct生成的查询集

这可能很简单,但我就是不太明白,也找不到任何东西

编辑1:

我需要在ORM里做这个

选择z.column1、z.column2、z.column3 从…起 在b.column1、b.column2、b.column1、b.column2、c.column3上选择DISTINCT 来自表1 a a.id=b.id上的内部联接表2 b b.id=c.id上的内部联接表3 c 按b.column1 ASC、b.column2 ASC、c.column4 DESC排序 Z 其中z.column3=‘某物’;

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


对不起,如果我之前没有具体说明。这在我的脑子里是不清楚的。

不,你不能在一次简单的选择中做到这一点。 正如您在注释中所说,在Django中,ORM过滤器映射到SQL子句WHERE,而distinct映射到distinct。在SQL中,通过对结果集进行操作,DISTINCT总是发生在WHERE之后,请参见示例

但是你可以将子查询写入嵌套选择,这取决于实际的目标,我不知道你现在的目标是什么..你能详细说明一下吗


另外,对于您的查询,distinct'a只保留第一次出现的具有相同a的示例,这是您想要的吗

非常感谢你们的帮助。我尝试了这两个建议,但都无法将其中任何一个建议付诸实施,但我认为这让我开始朝着正确的方向前进

我最终使用了

from django.db.models import Max, F

Example.objects.annotate(latest=Max('foreignkey__timefield')).filter(foreignkey__timefield=F('latest'), foreign__a='Something')
这将检查每个示例的最新foreignkey__时间字段是什么,如果它是最新的,并且a=something,则保留它。如果不是最新或最新版本=对于每个示例,它都会被过滤掉


这并没有嵌套子查询,但它提供了我想要的输出——而且相当简单。如果有更简单的方法,我真的很想知道。

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

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

我的用例是过滤反向关系。如果示例中有一些ForeignKey来建模Toast,那么您可以执行以下操作:

Toast.objects.filter(pk__in=bar.values_list('foreign_key',flat=true))
这将为您提供所有Toast实例,其中最新关联的示例符合您的筛选条件


关于性能的重大健康警告,如果使用此条很可能是一个巨大的查询,那么您可能会度过一段不愉快的时光。

除非我大错特错,否则顺序应该没有那么重要:这些都被编译成DB查询,至少在理论上,你说得对,它们被编译成一个DB查询,但这正是问题所在。筛选器在查询中变成“where”子句,distinct在查询中添加“distinct”子句,这意味着在distinct生效之前对其进行筛选。我需要对不同的部分进行评估,然后过滤结果。你到底为什么要这样做?如果您更改实际查询中的顺序,结果会有什么不同?如果之前应用了b=something过滤器,但其计算结果不为true,那么我们将根据顺序为每个a获取下一个条目。如果b=something过滤器在之后应用,且计算结果不为true,则结果中不包括a。当我说之后,那将是另一个问题,不是吗?这是我的问题吗?抱歉,我刚刚编辑了外键引用。请参阅上面的编辑。是的,第一次出现就是我想要的。