2

比較的単純なことを実現したい: id の範囲を指定して、モデルからすべてのオブジェクトを取得したい (たとえば、本の章から 5 行目から 10 行目を取得する)。

現在、views.py で次のことを行っています。

def line_range(request, book_id, chapter_id, line_start, line_end):
   book_name = get_object_or_404(Book, id = book_id)
   chapter_lines = []
   for i in range (int(line_start), int(line_end)+1):
      chapter_lines .append(Line.objects.get(book = book_id, chapter = chapter_id, line = i))
return render_to_response('app/book.html', {'bookTitle': book_name, 'lines': chapter_lines })

さて、これは明らかに最も最適化された方法ではありません。データベース クエリを 1 回しか実行できないのに、n 回実行することになるからです。次のような方法はありますか:

def line_range(request, book_id, chapter_id, line_start, line_end):
   book_name = get_object_or_404(Book, id = book_id)
   lines_range = range (int(line_start), int(line_end)+1)
   chapter_lines = get_list_or_404(Line, book = book_id, chapter = chapter_id, line = lines_range)
return render_to_response('app/book.html', {'bookTitle': book_name, 'lines': chapter_lines })

これにより、理論的にはより優れたデータベース クエリが生成され (n ではなく 1)、パフォーマンスが向上するはずです。もちろん、この構文は機能しません (リストではなく整数が必要です)。

ありがとう!

4

1 に答える 1

10

私はあなたが欲しいと思います__range

範囲テスト(包括的)。

例:

start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))

同等のSQL:

SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';

SQLでBETWEENを使用できる場所であればどこでも、日付、数値、さらには文字に対して範囲を使用できます。

だからあなたはそうなると思います:

chapter_lines = get_list_or_404(..., line__range=(int(line_start), int(line_end)+1))

同様に、片側比較には__lt、、、を使用できます。__gt__lte__gte

Djangoのドキュメントで常にウィンドウを開いたままにしておくことをお勧めします。見ているだけで、そこにはたくさんの素晴らしい情報があります。

于 2012-06-27T15:05:47.023 に答える