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 在处理子查询方面要好得多,应该没问题
我正在使用 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 在处理子查询方面要好得多,应该没问题