【发布时间】: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的方式。
标签: python sql django django-models django-queryset