Django Queryset:通过id加上n个实例通过排序获取实例

Django Queryset: get instance by id plus n instances by ordering

我有一个 Conversation 和一个 Message class(消息按时间戳排序)。当我呈现对话时,我加载了 n 条消息。较旧的消息应通过 ajax 按需请求加载。

我的初始视图查询集是:

messages = conversation.message_set.all()[:settings.INITIAL_MSG_LOAD]

在我的 ajax 视图中,我有最旧的显示消息的 pk (oldest_id)。

messages = []
append_msg = False
append_counter = settings.INITIAL_MSG_LOAD
for message in conversation.message_set.all():
    if append_msg:
        messages.append(message)
        append_counter -= 1
        if append_counter == 0:
            break
    if message.id == oldest_id:
        append_msg = True

我不太了解针对这两个请求发送到数据库的 SQL 查询。

数据库是否returns 第二次请求中的所有消息?是否有更有效的方法来通过给定的 pk 获取下一组 n 条消息?

一次查询即可,效率会高很多:conversation.message_set.filter(id__gt=oldest_id)[:settings.INITIAL_MSG_LOAD]

解释:用 id 磨碎器过滤 conversation 中的 messages,然后 oldest_idsettings.INITIAL_MSG_LOAD 限制行数,messages 默认排序] 来自 timestamp