Django orm 使用case when排序

geteshi
2022-08-24 / 0 评论 / 36 阅读 / 正在检测是否收录...

from django.db.models import Case, When
# 先取出商品id和销量
ratings_tuples = [(r.id, r.sales) for r in Product.objects.filter()]
# 根据销量降序排序
ratings_list = sorted(ratings_typles, key=lambda x: x[1], reverse=True)
print ratings_list
[(20L, 1000L), (2187L, 503L), (7715L, 483L), (7711L, 430L), (7720L, 421L), (7717L, 353L), (7719L, 352L), (7712L, 344L), (883L, 300L), (7718L, 276L), (7716L, 219L), (1935L, 110L), (592L, 100L), (3293L, 65L), (2439L, 56L), (7671L, 50L), (1597L, 30L), (7705L, 30L), (777L, 20L), (2292L, 20L), (1563L, 19L), (7706L, 18L), (2L, 16L), (7012L, 16L), (1255L, 12L), (15L, 11L), (1183L, 11L), (3101L, 11L), (7710L, 11L), (59L, 10L), (1256L, 10L), (4029L, 10L), (5831L, 10L), (7241L, 10L), (1L, 9L), (50L, 9L), (1933L, 9L), (2613L, 8L), (18L, 7L), (524L, 6L), (1934L, 6L), (221L, 5L), (1601L, 5L), (1702L, 5L), (1855L, 5L), (5195L, 5L), (7073L, 5L), (7709L, 5L), (7L, 4L), (695L, 4L), (1018L, 4L), (2303L, 4L), (2674L, 4L), (3671L, 4L), (4435L, 4L), (7669L, 4L), (264L, 3L), (589L, 3L), (2526L, 3L), (5115L, 3L), (5305L, 3L), (7616L, 3L), (7695L, 3L), (17L, 2L), (77L, 2L), (770L, 2L), (1474L, 2L), (1591L, 2L), (1961L, 2L), (2763L, 2L), (3670L, 2L), (4434L, 2L), (7479L, 2L), (3L, 1L), (5L, 1L), (16L, 1L), (19...
# 将排序后的id放在一个列表里面
pk_list = [idx for idx, sales in ratings_list]
# 根据这个id进行case when的排序
preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pk_list)])
query = Product.objects.filter(pk__in=pk_list).order_by(preserved)
1

评论 (0)

取消