【问题标题】:Django execute order by before filterDjango在过滤器之前执行顺序
【发布时间】:2020-07-10 05:31:56
【问题描述】:

我正在使用 django 2.0.7 所以,我想订购一个查询集,然后选择不同的条目, 之后,我将执行一些过滤 正如你在这里看到的,我正在做订单并选择不同的东西

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.objects.filter(..).order_by(..).distinct(..)。究竟为什么会有这样的问题?
  • 这是 SQL 的语法,ORDER BY 总是在 WHERE 之后
  • 问题是我需要将结果缩小到每个用户一个,然后在该结果上执行过滤器,但实际发生的是过滤器在所有行上执行!
  • 是的,我知道这是 SQL 的语法,这就是为什么我说如果有任何方法可以强制 django ORM ** 包装最后一个结果(对有序查询执行另一个选择)**

标签: python django web filter django-queryset


【解决方案1】:

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

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

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

【讨论】:

  • thaaaaanx 一个战利品,就是这样 :)
  • 我正在使用 postgres,所以我应该没问题;)
猜你喜欢
  • 2013-11-27
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2015-01-10
相关资源
最近更新 更多