django查询和子查询之间的最快请求

时间:2016-07-21 17:29:50

标签: django orm

如果我有:

 class Record(models.Model):

     start_time = models.Integerfield()  Timestamp

在一个视图中,我想迭代开始日期和结束日期之间的日子。

做得更快:

 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 个答案:

答案 0 :(得分:1)

在这两种情况下,您都不会触发要评估的查询集。 filter除了在下划线实现中编写sql语句之外什么都不做,所以在任何一种情况下都不会命中数据库,你只是在编写程序中的几个sql语句。只有当你开始使用变量时,django才会开始进行查询集评估。

关于querysets are lazy的Django doc。如果每个orm语句都在击中数据库,那么它就不会是最佳的。