2009-10-06 87 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