从Django中的一系列ID中检索匹配对象的列表

时间:2012-06-27 15:00:41

标签: django django-models

我想要实现一些相对简单的事情: 我希望在给定一系列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 })

现在,这显然不是最优化的处理方式,因为它只能在一个数据库查询中进行数据库查询。 有没有办法做这样的事情:

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 })

理论上,这将产生更好的数据库查询(1而不是n),并且应该是更好的性能。 当然,这种语法不起作用(期望整数,而不是列表)。

谢谢!

1 个答案:

答案 0 :(得分:5)

我想你想要__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文档保持打开窗口。如果你只是看,那里有很多很棒的信息。