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

79 阅读3分钟

在构建网站时,我想制作一个简单的 Flickr。具体的问题出现在我想在页面上显示一张照片(来自我的 Photo 模型)时,也希望显示流中它之前和之后的照片。

如果我只按日期或仅按 ID 对这些流进行排序,那可能会更简单......但事实并非如此。我希望允许用户通过各种方法进行排序和筛选。排序很简单。我已经完成了,我有一个结果集,包含 0-many Photos。

a8ba40ea0d98fa44a1eee7f63e57bdd.png 如果我想要一张照片,我从过滤/排序/等流开始。从中我需要得到当前的照片、它之前和之后的照片。

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

prev = None
next = None
photo = None

for i in range(1, filtered_queryset.count()):
    if filtered_queryset[i].pk == desired_pk:
    http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
        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 选择它及其两个(或一个或零个)最接近的邻居的方法,我很想了解!

2、解决方案

解决方案 1:

我看到了以下可能性:

  • URL 查询参数包含排序/过滤信息和某种“项目编号”,这是过滤查询集中的项目编号。这是简单的情况 - 前项和后项分别为项目编号减一和加一(加上一些边界检查)
  • 您希望 URL 是永久链接,并包含照片主键(或某个唯一 ID)。在这种情况下,您可能将排序/过滤存储在:
URL 中作为查询参数。在这种情况下,您没有真正的永久链接,因此您也可以将项目编号放入 URL 中,让您回到选项 1。
页面中的隐藏字段中,并使用 POST 而不是普通链接进行链接。在这种情况下,也将项目编号放入隐藏字段中。
会话数据/cookie 中。如果用户打开了两个具有不同排序/过滤应用的选项卡,这将会中断,但这可能是一个您不介意的限制 - 毕竟,您已经设想他们可能只会使用一个选项卡并单击列表。在这种情况下,也将项目编号存储在会话中。您可能能够巧妙地“命名空间化”项目编号,以防他们打开了多个选项卡。

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

解决方案 2:

您可以尝试以下操作:

  • 评估过滤/排序的查询集并获取照片 ID 的列表,您将其保存在会话中。这些 ID 全部匹配过滤/排序条件。
  • 在会话中也保留此列表中的当前索引,并在用户移动到上一张/下一张照片时对其进行更新。使用此索引获取要在显示照片中使用的上一个/当前/下一个 ID。
  • 当过滤/排序条件发生更改时,重新评估列表并将当前索引设置为合适的值(例如,新列表中的第一张照片为 0)。