gpt4 book ai didi

mysql - 我想知道 Django 查询集中的排名

转载 作者:可可西里 更新时间:2023-11-01 08:09:00 24 4
gpt4 key购买 nike

我有一个产品列表模型,想知道这个模型的具体价格的排名。

sorted_product_list = Product.objects.all().order_by('-price')
my_product = {'id': 10, 'price': 20000}

django 有 RowNum 类,但不支持 mysql我只有一个想法,那就是使用 enumerate

for rank, element in enumerate(sorted_product_list):
if element.id == my_product.id:
my_product_rank = rank

还有其他解决办法吗?

最佳答案

我们可以通过计算具有更高 Product数量来获得rank价格(所以先来的),所以:

rank = Product.objects.filter(price__gt=myproduct['price']).count()

或者如果我们事先不知道价格,我们可以先获取价格:

actual_price = Product.objects.values_list('price', flat=True).get(id=myproduct['id'])
rank = Product.objects.filter(price__gt=actual_price).count()

因此,我们可以过滤该行上方的行数,然后计算它,而不是“生成”一个表。

请注意,如果多个 Product具有相同的价格,我们将采用这些Product中最小的排名因此,如果有四种价格分别为 200 美元、100 美元、100 美元和 50 美元的产品,那么价格为 100 美元的 Product 都将具有排名 1。价格为 50 美元的 Product 的排名为 3。从某种意义上说,这是合乎逻辑的,因为这些产品之间没有“内部排名”:数据库可以自由地以任何它想要的方式返回这些产品。

假设在 price 列上有一个索引(并且它是一个二叉树),这应该会很快。因此,查询将不会从数据库中获取元素。

如果内部排名很重要,我们可以使用一种方法,首先确定“外部排名”,然后遍历Product 具有相同的价格来确定“内部 排名”,但请注意,这没有多大意义,因为在两次查询之间,此“内部订单”可能会发生变化:

# rank that also takes into account *equal* prices, but *unstable*
actual_price = Product.objects.values_list('price', flat=True).get(id=myproduct['id'])
rank = Product.objects.filter(price__gt=actual_price).count()
for p in Product.objects.filter(price=actual_price):
if p.id != myproduct['id']:
rank += 1
else:
break

因此,我们在未找到产品时继续递增,如果找到,我们将停止迭代并获得排名。

关于mysql - 我想知道 Django 查询集中的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51927718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com