Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何根据查询集中的值为对象分配排名_Python 3.x_Django_Django Queryset_Django Orm - Fatal编程技术网

Python 3.x 如何根据查询集中的值为对象分配排名

Python 3.x 如何根据查询集中的值为对象分配排名,python-3.x,django,django-queryset,django-orm,Python 3.x,Django,Django Queryset,Django Orm,我有一个queryset,它返回一个菜单列表,我想根据累积的投票数为每个菜单分配一个等级。有没有一种方法可以使用django查询表达式实现这一点?我也愿意接受任何其他建议 查询集如下: qs=Menu.objects.filter(Q(创建日期为今天的日期)).order\u by('-vots') 菜单类模型如下图所示: class Menu(models.Model): """Represents menu class model""

我有一个queryset,它返回一个菜单列表,我想根据累积的投票数为每个菜单分配一个等级。有没有一种方法可以使用django查询表达式实现这一点?我也愿意接受任何其他建议

查询集如下:

qs=Menu.objects.filter(Q(创建日期为今天的日期)).order\u by('-vots')

菜单类模型如下图所示:

class Menu(models.Model):
    """Represents menu class model"""
    restaurant = models.ForeignKey(Restaurant,null=True,blank=True,on_delete=models.CASCADE)
    file = models.FileField(upload_to='menus/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    uploaded_by = models.CharField(max_length=50, null=True, blank=True)
    votes = models.IntegerField(default=0)
序列化后,queryset返回以下数据:

[
  {
        "id": 10,
        "file": "https://res.cloudinary.com/dw9bllelz/raw/upload/v1/media/menus/index_ah660c.jpeg",
        "restaurant": "Burger King",
        "votes": 10,
        "created_at": "2021-06-03T09:33:05.505482+03:00"
    },
    {
        "id": 9,
        "file": "https://res.cloudinary.com/dw9bllelz/raw/upload/v1/media/menus/index_ah660c.jpeg",
        "restaurant": "Texas Plates",
        "votes": 2,
        "created_at": "2021-06-03T09:33:05.505482+03:00"
    },
    {
        "id": 8,
        "file": "https://res.cloudinary.com/dw9bllelz/raw/upload/v1/media/menus/index_ah660c.jpeg",
        "restaurant": "Carlito Dishes",
        "votes": 2,
        "created_at": "2021-06-03T09:33:05.505482+03:00"
    },
      {
        "id": 7,
        "file": "https://res.cloudinary.com/dw9bllelz/raw/upload/v1/media/menus/index_ah660c.jpeg",
        "restaurant": "Kram Dishes",
        "votes": 1,
        "created_at": "2021-06-03T09:33:05.505482+03:00"
    },

]
您可以使用数组中对象的索引作为其索引,也可以使用并使用
Rank
DenseRank
()函数根据需要计算列组:

from django.db.models import F, Window
from django.db.models.functions import Rank


qs = Menu.objects.filter(
    Q(created_at__date__iexact=todays_date)
).annotate(
    rank=Window(
        expression=Rank(),
        order_by=F('votes').desc(),
    )
)


for menu in qs:
    print(menu.rank, menu.votes)
您可以使用数组中对象的索引作为其索引,也可以使用并使用
Rank
DenseRank
()函数根据需要计算列组:

from django.db.models import F, Window
from django.db.models.functions import Rank


qs = Menu.objects.filter(
    Q(created_at__date__iexact=todays_date)
).annotate(
    rank=Window(
        expression=Rank(),
        order_by=F('votes').desc(),
    )
)


for menu in qs:
    print(menu.rank, menu.votes)

@AbdulAzizBarkat更新了问题。你已经有了
order\u by('-vots')
那么不是索引(或者更准确地说是
index+1
)数组中项目的排名?@AbdulAzizBarkat我知道你的观点,我可以从列表中按索引排名,并处理项目拥有相同投票数时的排名。如果你愿意,你也可以使用和使用
rank
DenseRank
()根据你的需要。你在使用django rest框架吗?@AbdulAzizBarkat更新了问题。你已经有了
order\u by('-vots')
那么不是索引(或者更准确地说是
index+1
)数组中项目的排名?@AbdulAzizBarkat我知道你的观点,我可以从列表中按索引排名,并处理项目拥有相同投票数时的排名。如果你愿意,你也可以使用和使用
rank
DenseRank
()根据您的需要。您正在使用django rest framework吗?它只返回经过筛选的查询集。我看不到列组:
[,]
@PhilipMutua为什么它会在查询集字符串表示中显示列组?调用模型的
\uuu str\uu
来生成这些表示。检查我的编辑模型实例是否使用列组进行注释。它只返回过滤后的查询集。我看不到列组:
[,]
@PhilipMutua为什么在查询集字符串表示中显示列组?调用模型的
\uuu str\uu
来生成这些表示。选中“我的编辑”,则模型实例将使用秩进行注释。