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_id
按 settings.INITIAL_MSG_LOAD
限制行数,messages
默认排序] 来自 timestamp
我有一个 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_id
按 settings.INITIAL_MSG_LOAD
限制行数,messages
默认排序] 来自 timestamp