Django 在过滤器之前执行命令

Django execute order by before filter

我正在使用 Django 2.0.7 所以,我想订购一个查询集,然后订购 select 个不同的条目, 在那之后,我要进行一些过滤 正如你在这里看到的,我正在执行命令和 select 不同的东西

forms = Form.objects.order_by('user','-created_at').distinct('user')

这里我过滤了一些属性

filterd_qs = forms.filter(**query)

问题是 order_by 查询是在过滤器查询 之后执行的,这会导致意外结果(它将过滤器应用于整个查询集), sql 查询来自最后一个过滤器:

SELECT DISTINCT ON ("table"."user_id") fields FROM "appname_form" WHERE where_clause ORDER BY "appname_form"."user_id" ASC, "appname_form"."created_at" DESC;

那么我如何强制 django orm 通过过滤器查询包装 orderby 查询!! 任何建议都行

编辑: 伙计们,我认为你不明白这个问题, 假设我们有这个查询集

queryset = [
('john',"02-23-2020",type2),
('sarah',"02-03-2020",type1),
('joe',"01-11-2020",type2),
('john',"02-25-2020",type1),
('joe',"02-28-2020",type1)
]

当我第一次执行不同的 orderby 查询时,结果将是

queryset = [
('john',"02-25-2020",type1),
('sarah',"02-03-2020",type1),
('joe',"02-28-2020",type1)
]

然后,当我执行过滤器时,例如:

queryset = Form.objects.order_by('user','-created_at').distinct('user')
qs = queryset.filter(type=type2)

结果会是

queryset = [
('john',"02-23-2020",type2),
('joe',"01-11-2020",type2)
]

尽管结果应该是一个空查询集!!

您可以创建一个包含每个用户的最新 Form 的子查询,然后按此子查询进行过滤以获得您想要的内容

forms = Form.objects.filter(
    id__in=Form.objects.order_by('user','-created_at').distinct('user').values('id')
).filter(**query)

MySQL 通常在处理子查询时非常糟糕,如果您使用 MySQL 评估子查询并传递结果,它可能会执行得更好。 PostgreSQL 在处理子查询方面要好得多,应该没问题