【发布时间】: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