我正在编写一个Django应用程序,我想从查询中获取所有项目,但最后一次。我的查询是这样的:
objects = Model.objects.filter(name='alpha').order_by('rank')[:-1]
但是它抛出错误:
断言错误:不支持负索引。不知道我在哪里 出问题了吗?
任何建议将不胜感激。
答案 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()