Py学习  »  Python

如何在django ORM中得到python[:-1]的等价值?

sshussain270 • 4 年前 • 618 次点击  

我正在编写一个Django应用程序,在这里我希望从一个查询中获取所有项,但最后一个项除外。我的问题是这样的:

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

但它抛出了错误:

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

如有任何建议,将不胜感激。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50682
 
618 次点击  
文章 [ 3 ]  |  最新文章 4 年前
Serenity Ashish Sharma
Reply   •   1 楼
Serenity Ashish Sharma    4 年前

Django中不允许使用否定索引。 但是,可以在OrthyBy函数中使用负索引,并按顺序获取第一个或任意数量的对象。 你可以这样做:

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

在这里 n 建议需要的对象数。在你的情况下是:

objects = Model.objects.filter(name='alpha').order_by('-rank')[1:]
Scircia
Reply   •   2 楼
Scircia    5 年前

编辑

Django不支持QueDeSET上的否定索引。请阅读 https://code.djangoproject.com/ticket/13089 更多信息。

快速和“肮脏”的做法是将QueReStices转换为一个列表,然后使用否定索引。

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

请注意,objects变量不再是queryset而是list。

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

如果您想使用.exclude()方法,我建议您阅读下面的解决方案@RaydelMiranda。

Raydel Miranda
Reply   •   3 楼
Raydel Miranda    5 年前

你可以用 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   
)