2

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

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

如果我想要一个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 选择两个(或一个或零个)最近的邻居,我很想知道!

4

2 回答 2

1

我看到以下可能性:

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

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

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

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

于 2009-10-06T20:44:43.597 回答
1

您可以尝试以下方法:

  1. 评估过滤/排序的查询集并获取您在会话中保存的照片 ID 列表。这些 id 都符合过滤/排序标准。
  2. 在会话中也将当前索引保留在此列表中,并在用户移动到上一张/下一张照片时更新它。使用此索引获取用于显示照片的上一个/当前/下一个 ID。
  3. 当过滤/排序标准改变时,重新评估列表并将当前索引设置为合适的值(例如,0 表示新列表中的第一张照片)。
于 2009-10-06T21:11:34.780 回答