2

奇妙に聞こえますが、それは本当に単純な考えです。作成しているWebサイト用にシンプルなFlickrを作成しようとしています。この特定の問題はPhoto、ページに(モデルからの)1枚の写真を表示したいが、ストリームの前の画像と後の画像も表示したい場合に発生します。

これらのストリームを日付で並べ替えるだけの場合、またはIDで並べ替えるだけの場合は、もっと簡単かもしれません...しかし、そうではありません。ユーザーがさまざまな方法で並べ替えとフィルタリングを行えるようにしたいと思います。並べ替えは簡単です。私はそれを実行し、0から多くPhotoのを含む結果セットを持っています。

単一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つ(または1つ、または0)の最も近いネイバーを持つものを選択する方法がある場合は、知りたいです!

4

2 に答える 2

1

次の可能性があります。

  1. URLクエリパラメータには、並べ替え/フィルタリング情報と、フィルタリングされたクエリセットのアイテム番号である「アイテム番号」のようなものが含まれています。これは単純なケースです-前と次はそれぞれアイテム番号から1を引いたものと1を加えたものです(さらにいくつかの境界チェック)

  2. URLをパーマリンクにし、写真の主キー(または一意のID)を含める必要があります。この場合、おそらく次の場所に並べ替え/フィルタリングを保存しています。

    • クエリパラメータとしてURLに。この場合、真のパーマリンクがないため、URLにアイテム番号を貼り付けて、オプション1に戻ることもできます。
    • ページ内の非表示フィールド、および通常のリンクの代わりにリンクにPOSTを使用します。この場合、隠しフィールドにもアイテム番号を貼り付けてください。
    • セッションデータ/クッキー。これは、ユーザーが異なる並べ替え/フィルタリングを適用して2つのタブを開いている場合に機能しなくなりますが、これは気にしない制限である可能性があります。結局のところ、ユーザーはおそらく1つのタブを使用して、リストをクリックするだけであると想定しています。この場合、セッションにもアイテム番号を保存します。複数のタブが開いている場合は、アイテム番号を「名前空間」にするための巧妙な方法を実行できる可能性があります。

つまり、フィルタリング/並べ替え情報を保存する場所にアイテム番号を保存します。

于 2009-10-06T20:44:43.597 に答える
1

次のことを試すことができます。

  1. フィルタリング/ソートされたクエリセットを評価し、セッションで保持している写真IDのリストを取得します。これらのIDはすべて、フィルター/ソート基準に一致します。
  2. セッションでも現在のインデックスをこのリストに保持し、ユーザーが前/次の写真に移動したときに更新します。このインデックスを使用して、写真の表示に使用する前/現在/次のIDを取得します。
  3. フィルタリング/並べ替えの基準が変更されたら、リストを再評価し、現在のインデックスを適切な値に設定します(たとえば、新しいリストの最初の写真の場合は0)。
于 2009-10-06T21:11:34.780 に答える