django queryset为什么使用count 而不是使用len方法
在Django中,假设我要遍历并打印结果的QuerySet,那么对对象进行计数的最佳选择是什么? len(qs)或qs.count()?是len()方法块,还是count()速度更快? 在len()和count()之间进行选择取决于情况,本文深入讲解len()和count()如何正确使用:
len(queryset)?#?提取所有数据-无需支付额外费用-仍将在for循环中提取数据 for?obj?in?queryset:?#?len()已获取数据-使用缓存 ????pass Count queryset.count()?#?这将执行额外的数据库查询-len()没有 for?obj?in?queryset:?#?获取数据 ????pass ????3.恢复第二种情况(当已经获取查询集时): for?obj?in?queryset:?#?迭代获取数据 ????len(queryset)?#?使用已经缓存的数据?-?O(1)?没有额外开销 ????queryset.count()?#?使用缓存?-?O(1)?没有额外的数据库查询 len(queryset)?#?一样?O(1) queryset.count()?#?一样,没有查询?O(1) QuerySet源码: class?QuerySet(object): ????def?__init__(self,?model=None,?query=None,?using=None,?hints=None): ????????#?(...) ????????self._result_cache?=?None ????def?__len__(self): ????????self._fetch_all() ????????return?len(self._result_cache) ????def?_fetch_all(self): ????????if?self._result_cache?is?None: ????????????self._result_cache?=?list(self.iterator()) ????????if?self._prefetch_related_lookups?and?not?self._prefetch_done: ????????????self._prefetch_related_objects() ????def?count(self): ????????if?self._result_cache?is?not?None: ????????????return?len(self._result_cache) ????????return?self.query.get_count(using=self.db) querySet文档: https://docs.djangoproject.com/en/2.2/ref/models/querysets/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |