gpt4 book ai didi

python - 按对象从 QuerySet 中获取下一个和上一个对象

转载 作者:行者123 更新时间:2023-12-02 20:17:59 26 4
gpt4 key购买 nike

我有 object 和包含此对象的 QuerySet。我需要获取此 QuerySetnextprevious object

我该怎么做?

我可以通过这种方式获得下一个:

next = False
for o in QuerySet:
if next:
return o
if o==object:
next = True

但我认为在大型 QuerySet 上这是一种非常缓慢且低效的方法。

你知道更好的解决方案吗?

最佳答案

我知道这个问题有点老了,但我遇到了这个问题,但没有找到非常有效的解决方案,所以我希望它能对某人有所帮助。我想到了 2 个非常好的解决方案。

第一个更优雅,但性能稍差。第二种明显更快,尤其是对于较大的查询集,但它结合使用原始 SQL。

它们都可以找到上一个和下一个 id,但当然可以对其进行调整以检索实际的对象实例。

第一个解决方案:

object_ids = list(filtered_objects.values_list('id', flat=True))
current_pos = object_ids.index(my_object.id)
if current_pos < len(object_ids) - 1:
next_id = object_ids[current_pos + 1]
if current_pos > 0:
previous_id = object_ids[current_pos - 1]

第二种解决方案:

window = {'order_by': ordering_fields}
with_neighbor_objects = filtered_objects.annotate(
next_id=Window(
Lead('id'),
**window
),
previous_id=Window(
Lag('id'),
**window
),
)
sql, params = with_neighbor_objects.query.sql_with_params()
# wrap the windowed query with another query using raw SQL, as
# simply using .filter() will destroy the window, as the query itself will change.
current_object_with_neighbors = next(r for r in filtered_objects.raw(f"""
SELECT id, previous_id, next_id FROM ({sql}) filtered_objects_table
WHERE id=%s
""", [*params, object_id]))

next_id = current_object_with_neighbors.next_id:
previous_id = current_object_with_neighbors.previous_id:

关于python - 按对象从 QuerySet 中获取下一个和上一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com