社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

sshussain270 • 5 年前 • 1342 次点击  

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

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

但它抛出了错误:

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

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

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

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    6 年前

编辑

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    6 年前

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