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

时间:2009-10-06 19:49:00

标签: python sql django django-models django-queryset

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

如果我只按日期对这些流进行排序,或者只按ID排序,那可能会更简单......但我不是。我希望允许用户通过各种方法进行排序和筛选。分类很简单。我已经完成了,我有一个结果集,包含0多个Photo s。

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

2 个答案:

答案 0 :(得分:1)

我看到以下可能性:

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

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

    • 在URL中作为查询参数。在这种情况下,您没有真正的固定链接,因此您也可以将项目编号粘贴在URL中,然后返回选项1.
    • 页面中隐藏的字段,并使用POST代替普通链接。在这种情况下,也要将项目编号粘贴在隐藏字段中。
    • 会话数据/ cookies。如果用户打开两个选项卡并应用了不同的排序/过滤,这将会中断,但这可能是您不介意的限制 - 毕竟,您已经设想他们可能只是使用一个选项卡并单击列表。在这种情况下,也将项目编号存储在会话中。对于打开多个标签的情况,您可以做一些聪明的事情来“命名”项目编号。
  3. 简而言之,将项目编号存储在存储过滤/排序信息的任何位置。

答案 1 :(得分:1)

您可以尝试以下方法:

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