2009-10-06 86 views
2

听起来很奇怪,但这是一个非常简单的想法。我正在尝试为我正在构建的网站制作一个简单的Flickr。当我想在页面上显示单张照片(来自我的Photo型号)时,会出现此特定问题,但我也希望在流之前显示图像,并在其后显示图像。在Django查询当前选择之前和之后获取记录

如果我只是按日期排序这些流,或者只是按ID排序,那可能会更简单...但我不是。我想让用户通过各种方法进行排序和过滤。分类很简单。我已经完成了这项工作,并且我有一个结果集,其中包含0-many Photo s。

如果我想要一个Photo,我从那个过滤/排序/ etc流开始。从它我需要得到当前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来选择它,我很想知道!

+0

好像你试图创建索引,你没有。如果你有一群人,并且从人群中挑选出一个人,并说:“找到与这个人相关的下一个最矮和下一个最短的人”,你会怎么做? – 2009-10-06 19:54:41

+0

“然后,只有那样,我才能看到我的图像是否在选择中”< - 你能解释为什么是这种情况吗?你没有在网址中的图像ID? – 2009-10-06 19:56:39

+0

@Emil我有想要的图像的pk,但我需要找到它在列表中(如果以上是唯一的选项,则需要通过它来勾选)。我不能再过滤一次(或'.get()'),因为这会阻止我获得上一页/下一页照片 – Oli 2009-10-06 19:59:18

回答

1

你可以尝试以下方法:

  1. 评估过滤/分类的查询集并获得照片的身份证,你在会议举行的名单。这些ID都符合过滤/排序标准。
  2. 将当前索引保留在会话中的此列表中,并在用户移至上一张/下一张照片时进行更新。使用此索引可获取用于显示照片的prev/current/next id。
  3. 当过滤/排序条件发生变化时,重新评估列表并将当前索引设置为合适的值(例如,新列表中第一张照片的值为0)。
+0

我将不得不改变我存储文件的方式,但这可能工作得很好。为了提高速度,我将使用memcached而不是会话,以便查询缓存在用户之间共享。 – Oli 2009-10-06 22:10:15

1

我看到了以下可能性:

  1. 您的网址查询参数包含排序/过滤信息和某种“项目编号”,这是你的过滤查询集内的项目数。这是简单的情况 - 上一个和下一个是项目编号减1和加1分别(加上一些边界检查)

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

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

总之,存储项数随时随地可以存储过滤/分拣信息。

+0

如果流的顺序/内容改变(它会),#1会创建非永久的永久链接。我觉得#2是一样的。这些流将添加事物并提供评分,因此每张照片的分数都会随着时间而改变。会话/ cookie缓存可以工作,但有点肮脏。 – Oli 2009-10-06 21:44:21

+0

你在哪里存储排序/过滤? – spookylukey 2009-10-06 22:59:46