在 objects.all() 上过滤在 Django 中并不表现得懒惰
Filtering on objects.all() isn't behaving lazy in Django
Django 查询集应该是惰性的,但它看起来好像下面不是。
我有以下(5 秒)慢代码(在 200,000 条记录上):
1. qs = MyCars.objects.all()
2.
3.qs = qs.filter( car_id__gt=0 )
以下过滤速度很快:
A. qs = MyCars.objects.filter( car_id__gt=0 )
我错过了什么? (出于某种原因,我必须包括第 1 行)。
让它更有趣。如果我在第 2 行添加:
2. qs2 = qs
然后在第 7 行:
7. qs2 = qs2.filter( car_id__gt=0 )
然后它很快。
所以,我想我会在第 3 行使用 qs2 进行过滤,但速度很慢。
确保您没有执行任何提到的操作here in the django docs,因为它们会导致查询集被评估,并且它将运行对数据库进行查询。
如果您导致对查询集进行评估,如果当时的过滤器非常笼统并导致加载大量数据,则需要更长的时间。
好的,所以我在第 2 行写了 if qs:
。我把它改成了 if qs.count() > 0:
。我没有意识到我错过了代码的重要部分。
另一个原因是当您检查变量时。就我而言,我正在使用 PyCharm 调试,它正在评估查询,即执行它们,同时我正在检查它们。
Django 查询集应该是惰性的,但它看起来好像下面不是。
我有以下(5 秒)慢代码(在 200,000 条记录上):
1. qs = MyCars.objects.all()
2.
3.qs = qs.filter( car_id__gt=0 )
以下过滤速度很快:
A. qs = MyCars.objects.filter( car_id__gt=0 )
我错过了什么? (出于某种原因,我必须包括第 1 行)。
让它更有趣。如果我在第 2 行添加:
2. qs2 = qs
然后在第 7 行:
7. qs2 = qs2.filter( car_id__gt=0 )
然后它很快。
所以,我想我会在第 3 行使用 qs2 进行过滤,但速度很慢。
确保您没有执行任何提到的操作here in the django docs,因为它们会导致查询集被评估,并且它将运行对数据库进行查询。
如果您导致对查询集进行评估,如果当时的过滤器非常笼统并导致加载大量数据,则需要更长的时间。
好的,所以我在第 2 行写了 if qs:
。我把它改成了 if qs.count() > 0:
。我没有意识到我错过了代码的重要部分。
另一个原因是当您检查变量时。就我而言,我正在使用 PyCharm 调试,它正在评估查询,即执行它们,同时我正在检查它们。