【问题标题】:How to get next row on a django queryset?如何在 django 查询集上获取下一行?
【发布时间】:2011-06-26 11:11:29
【问题描述】:

我有一个查询集,它将在其中返回几行。其中一行有一个 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

【问题讨论】:

    标签: django


    【解决方案1】:

    对于py

    queryset.iterator().next()
    

    对于 >= 2.6

    next(queryset.iterator())
    

    应该做的伎俩

    【讨论】:

    • 我知道这将得到下一个项目,但我仍然需要先指向确切的行,然后才能调用 next(),这是我的问题。
    【解决方案2】:

    查询集是生成器,因此实际上并没有像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)
    

    虽然写起来很有趣,但这不太可能带来任何性能优势(除非您的模型有很多字段,在这种情况下,首先迭代 values_list() 的输出可能是有益的)。

    相关答案:Get the index of an element in a queryset

    【讨论】:

    • 感谢您的链接,我发现我的答案与您的最后一点混在一起。
    • 在将一个传递给下一个内置函数之后,我现在正盯着这个 TypeError “QuerySet 对象不是迭代器”。它们是可迭代的,因为它们返回一个迭代器,但 QuerySet 本身不是一个迭代器。
    • 确实,它们不是迭代器。它们更像是带有额外花里胡哨的发电机。要获取实际的迭代器,请使用QuerySet.iterator()
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多