属性Page
を持つオブジェクトを含む QuerySet があります。page_number
QuerySet は でソートされるpage_number
ため、実行[i.page_number for i in pages_query_set]
すると、たとえば のようなものが返され[1,2,3,5,6,10,11,13,16,19,21]
ます。私のタスクは、Page
オブジェクトが連続するようにオブジェクトを移動するメソッドを作成することです。この例では、5 だったページは 4 になり、6 は 5 になり、10 は 6 になり、11 は 7 になり、13 は 8 になります。
PageQuerySet
これは私の最初の解決策であり、クラス内のメソッドです:
def validatePageNumbers(self):
prev_page = 0
for page in self:
if page.page_number > prev_page+1:
page.page_number = prev_page+1
page.save()
prev_page = page.page_number
機能的には、問題なく動作します。ただし、save()
毎回呼び出すと、実際に速度が低下します (おそらく、毎回データベース クエリを呼び出すため)。より速いアプローチを見つける必要があります。sliced_qs.update(page_number=models.F('page_number')-gap)
このシーケンスに「ギャップ」が 1 つしかない場合は、QuerySet をスライスして のようなものを使用しupdate()
ますsave()
。しかし、ギャップは複数あり、かなりランダムです。
だから私は混乱しています。F
オブジェクトはそのようなループをサポートしていないようです。で callable を使用できれば素晴らしいのですがupdate()
、ドキュメントでそれに関する情報が見つからず、試してみても機能しません。こちらから応募する方法はありupdate()
ますか?または、このメソッドを高速化する他の方法はありますか?