我有一个查询集,将返回其中的几行.其中一行有一个slug"slug-456",如果相对于查询集的当前排序具有slug"slug-456"的那一行之后,我如何到达下一行?
我可以遍历查询集并检查当前行是否有slug"slug-456",如果它注意到下一行是我所追求的,但有更有效的方法吗?
更新: 我是这样做的:
id_list = list(qs.values_list('id', flat=True))
try:
next_id = id_list[id_list.index(obj.id) + 1]
obj = Object.objects.get(id=next_id)
except IndexError:
pass
Run Code Online (Sandbox Code Playgroud)
对于py <2.6,
queryset.iterator().next()
Run Code Online (Sandbox Code Playgroud)
对于> = 2.6
next(queryset.iterator())
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩
查询集是生成器,因此没有真正的快捷方式qs[qs.indexof(slug="..")+1].您提出的任何解决方案仍然需要遍历查询集(至少直到目标对象).
正如您所提到的,一种可能的方法是循环查询集并在slug ="slug-456"之后返回一个查询集.
你当然可以采取更复杂的路线,并采取以下措施:
# get slugs in order
sio = list(qs.objects.values_list('slug', flat=True))
target_slug = sio[sio.index(sio) + 1] # watch for KeyError
your_object = qs.objects.get(slug__exact=target_slug)
Run Code Online (Sandbox Code Playgroud)
虽然有趣写,但这不太可能带来任何性能上的好处(除非你的模型有很多字段,在这种情况下迭代values_list()第一个输出可能是有益的).
相关回答:获取查询集中元素的索引.
| 归档时间: |
|
| 查看次数: |
7555 次 |
| 最近记录: |