在Django查询中获取当前选择之前和之后的记录

Posted

技术标签:

【中文标题】在Django查询中获取当前选择之前和之后的记录【英文标题】:Get records before and after current selection in Django query 【发布时间】:2010-12-04 09:42:09 【问题描述】:

这听起来很奇怪,但这是一个非常简单的想法。我正在尝试为我正在构建的网站制作一个简单的 Flickr。当我想在页面上显示单张照片(来自我的Photo 模型)但我还想在流中显示它之前的图像和它之后的图像时,就会出现这个特定问题。

如果我只是按日期对这些流进行排序,或者只是按 ID 排序,那可能会更简单……但我不是。我想让用户通过各种方法进行排序和过滤。排序很简单。我已经这样做了,我有一个结果集,包含 0-many Photos。

如果我想要一个Photo,我会从过滤/排序/等流开始。从中我需要获取当前的Photo、之前的Photo 和之后的Photo

这是我目前正在查看的内容。

prev = None
next = None
photo = None

for i in range(1, filtered_queryset.count()):
    if filtered_queryset[i].pk = desired_pk:
        if i>1: prev = filtered_queryset[i-1]
        if i<filtered_queryset.count(): next = filtered_queryset[i+1]
        photo = filtered_queryset[i]
        break

看起来混乱得令人作呕。而且效率低下。天啊,效率太低了。有人可以改进它吗?

Django 查询是后期绑定的,因此使用它会很好,尽管我猜考虑到我可怕的限制,这可能是不可能的。

编辑:我突然想到我可以插入一些 SQL 来重新过滤查询集。如果有一种方法可以使用 SQL 选择两个(或一个或零个)最近的邻居,我很想知道!

【问题讨论】:

似乎您正在尝试创建没有索引的索引。如果你有一群人,从人群中挑出一个人说:“给我找一个比这个人高和第二矮的人”,否则你会怎么做? “然后,只有这样,我才能看到我的图像是否在该选择中” @Emil 我有所需图像的 pk,但我需要在列表中找到它(如果上面是唯一的选项,则需要勾选它)。我不能再次过滤(或.get()),因为那会阻止我获取上一张/下一张照片 @a 付费书呆子:是的,在那个代码中,我需要调用 .list() 来获取索引,但这只是粗略的。我已经有一个订单,在这段代码之前就已经整理好了。这就是我最终得到filtered_queryset的方式。 【参考方案1】:

您可以尝试以下方法:

    评估过滤/排序的查询集并获取您在会话中持有的照片 ID 列表。这些 id 都符合过滤/排序标准。 在会话中也将当前索引保留在此列表中,并在用户移动到上一张/下一张照片时更新它。使用此索引获取用于显示照片的上一个/当前/下一个 ID。 当过滤/排序标准发生变化时,重新评估列表并将当前索引设置为合适的值(例如,0 表示新列表中的第一张照片)。

【讨论】:

我将不得不改变我存储文件的方式,但这可能会很好。为了速度,我将使用 memcached 而不是会话,以便用户之间共享查询缓存。【参考方案2】:

我看到以下可能性:

    您的 URL 查询参数包含排序/过滤信息和某种“项目编号”,即您过滤后的查询集 的项目编号。这是一个简单的例子——previous 和 next 分别是项目号减一和加一(加上一些边界检查)

    您希望 URL 是永久链接,并包含照片主键(或某些唯一 ID)。在这种情况下,您大概将排序/过滤存储在:

    在 URL 中作为查询参数。在这种情况下,您没有真正的永久链接,因此您也可以在 URL 中粘贴项目编号,让您回到选项 1。 页面中的隐藏字段,并使用 POST 链接而不是普通链接。在这种情况下,请将项目编号也粘贴到隐藏字段中。 会话数据/cookies。如果用户打开了两个选项卡并应用了不同的排序/过滤,这将中断,但这可能是您不介意的限制 - 毕竟,您已经设想他们可能只会使用一个选项卡并单击列表。在这种情况下,也将项目编号存储在会话中。在打开多个选项卡的情况下,您可以巧妙地为项目编号“命名空间”。

简而言之,将项目编号存储在您存储过滤/排序信息的任何位置。

【讨论】:

#1 如果流的顺序/内容发生变化(它会),将创建非永久性永久链接。 #2 一样,我想。这些流将添加内容并进行评分,因此每张照片的分数都会随着时间而变化。会话/cookie 缓存可以工作,但有点脏。 您实际上将排序/过滤存储在哪里?

以上是关于在Django查询中获取当前选择之前和之后的记录的主要内容,如果未能解决你的问题,请参考以下文章

能否查询excel修改记录

js获取select选择之前和选择之后的值

我想在附近的地方搜索之前首先获得它的当前位置,并且可以选择在任何搜索之后或任何搜索之前

Django ORM查询无法选择新对象

单个 django 查询集获取 n 个相邻项目

获取在特定日期之前创建且在该日期之后未引用的 ID