如何在django ORM中获取python [:-1]的等值符号?

时间:2019-01-27 23:01:30

标签: python django django-models

我正在编写一个Django应用程序,我想从查询中获取所有项目,但最后一次。我的查询是这样的:

objects = Model.objects.filter(name='alpha').order_by('rank')[:-1]

但是它抛出错误:

  

断言错误:不支持负索引。不知道我在哪里   出问题了吗?

任何建议将不胜感激。

4 个答案:

答案 0 :(得分:1)

已编辑

Django不支持对QuerySet进行负索引。请阅读https://code.djangoproject.com/ticket/13089了解更多信息。

快速而“肮脏”的方法是将查询集转换为列表,然后使用负索引。

objects = list( Model.objects.filter(name='alpha').order_by('rank') )[:-1]

请注意,对象变量不再是查询集而是列表。

但是我建议使用.exclude()方法。

如果您想使用我推荐的.exclude()方法,我想请您阅读@RaydelMiranda在下面编写的解决方案。

答案 1 :(得分:1)

您可以使用QuerySet.last()获取最后一个,并使用其ID将其从结果中排除。

objects = Model.objects.filter(name='alpha').order_by('rank')
last = objects.last()
objects = objects.exclude(pk=last.pk)

从结果中排除所有具有在DB中找到的最小值的所有对象的查询:

objects = Model.objects.annotate(
    mini_rank=Min('rank'),         # Annotate each object with the minimum known rank
).exclude(
    mini_rank=F('rank')            # Exclude all objects ranked with the minimum value found   
)

答案 2 :(得分:0)

在Django中不允许负索引。 但是,您可以在order_by函数中使用负索引,并在订单中获取第一个或任意数量的对象。 您可以执行以下操作:

objects = Model.objects.filter(name='alpha').order_by('-rank')[n:]

这里n建议您将需要的对象数量。在您的情况下,将是:

objects = Model.objects.filter(name='alpha').order_by('-rank')[1:]

答案 3 :(得分:0)

    query=model.objects.filter(user=request.user)
    if query.exists():
        query=query.last()