对于项目库,用户可以手动对一些项目进行排序以始终使它们首先出现。
为此,模型有一个“排序”而不是 null PositiveIntegerField(默认为 0)。排序字段大于零的项目是手动排序的,并且必须出现在排序值为 0 的未排序项目之前。
可以使用的 SQL 查询可能是这样的:
(select photo, sort, 0 as priority from photos where sort > 0)
union all
(select photo, sort, 1 as priority from photos where sort = 0)
order by priority, sort
结果看起来像:
+---------+------+----------+
| photo | sort | priority |
+---------+------+----------+
| photo-a | 1 | 0 |
| photo-b | 2 | 0 |
| photo-c | 0 | 1 |
| photo-d | 0 | 1 |
| photo-e | 0 | 1 |
| ... |
但我不知道应该如何使用 Django Queryset 正确完成它?
我可以合并两个不同的list(chain(q1, q2))
查询集,但是查询被执行,这对于大型集合来说效率低下,特别是如果我的查询集应该被传递给 django.core.paginator 通常会应用 LIMIT OFFSET 子句进行分页。当然,我可以对每个查询应用切片q1
,q2
但这有点难看,因为它与分页器的功能重叠。
也许我试图以错误的方式做到这一点。或者也许应该用extra()方法来完成?