2016-07-21 56 views
0

之间最快的请求。如果我有:Django的查询和子查询

class Record(models.Model): 

    start_time = models.Integerfield() Timestamp 

并在View我想遍历开始日期和结束日期之间的天数。

它更快做:

records = Record.objects.filter(
    start_time__gte=dt.datetime.timestamp(start_date), 
    start_time__lt=dt.datetime.timestamp(end_date) 
) 
for start_day, stop_day in days_between_start_and_end_date: 
     records_week = records.filter(
    start_time__gte=dt.datetime.timestamp(start_day), 
    start_time__lt=dt.datetime.timestamp(stop_day) 
) 

或直接

for start_day, stop_day in days_between_start_and_end_date: 
     records_week = Record.objects.filter(
    start_time__gte=dt.datetime.timestamp(start_day), 
    start_time__lt=dt.datetime.timestamp(stop_day) 
) 

其实我想,可能看不出任何区别,但我不明白为什么,因为对我来说,我做的第一种情况是一个大的要求,第二种情况是很多小的要求。任何想法为什么?

+1

请记住,查询集是懒惰的。这些示例都不执行任何查询。 – knbk

回答

1

在这两种情况下,您都不会触发要评估的查询集。 filter不会在下划线实现中编写sql语句,因此在任何情况下都不会遇到数据库,您只是编写了几个位于程序中的sql语句。只有当你开始使用变量时,django才开始执行queryset评估。

Django doc关于querysets are lazy。如果每个orm语句触及数据库,它不会是最优的。