django:如何使查询不延迟执行?
django: how to make query be not lazy executed?
我的自定义管理器方法中的查询延迟执行有问题。在其中我想通过模型 CharField 选择和 return dict[choice, QuerySet].
来分离查询
model.py 部分:
...
PRODUCT_STATUS = [
('pn', 'Запланировано'),
('ga', 'В процессе (Ознакомляюсь)'),
('rv', 'Повтор'),
('ac', 'Завершено'),
('ab', 'Брошено'),
('pp', 'Отложено'),
]
class ExtendedManager(models.Manager):
def separated_by_status(self, product_type):
query = super().get_queryset().all()
dict_ = {}
for status in PRODUCT_STATUS:
dict_.update({status[1]: query.filter(status=status[0]).all()})
return dict_
...
views.py部分与经理使用:
...
class ProductListView(ContextMixin, View):
template_name = 'myList/myList.html'
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
product = kwargs.get('product')
if product not in {'film', 'game', 'series', 'book'}:
raise Http404
context = self.get_context_data()
context['title'] = f'Список {product}'
context['dict_queryset'] = Product.objects.separated_by_status(product)
return render(request, self.template_name, context)
...
django 调试工具栏结果:
here
问题是查询在管理器中是惰性执行的,但在模板中它已经为每个 PRODUCT_STATUS 元素单独完全执行。如何优化执行 1 次?
如果我用错了“懒惰”这个词,我很抱歉。
问题不是懒惰,问题是你做了一个QuerySet
per PRODUCT_STATUS
.
你可以用 groupby
function [Python-doc] of the itertools
module [Python-doc]:
一次性制作这样的字典
from itertools import groupby
from operator import attrgetter
class ExtendedManager(models.Manager):
def separated_by_status(self, product_type):
query = super().get_queryset().order_by('status')
dict_ = {
k: list(vs)
for k, vs in <strong>groupby(</strong>query<strong>, attrgetter('status'))</strong>
}
return {
status1: dict_.get(status0, [])
for status0, status1 in PRODUCT_STATUS
}
我的自定义管理器方法中的查询延迟执行有问题。在其中我想通过模型 CharField 选择和 return dict[choice, QuerySet].
来分离查询model.py 部分:
...
PRODUCT_STATUS = [
('pn', 'Запланировано'),
('ga', 'В процессе (Ознакомляюсь)'),
('rv', 'Повтор'),
('ac', 'Завершено'),
('ab', 'Брошено'),
('pp', 'Отложено'),
]
class ExtendedManager(models.Manager):
def separated_by_status(self, product_type):
query = super().get_queryset().all()
dict_ = {}
for status in PRODUCT_STATUS:
dict_.update({status[1]: query.filter(status=status[0]).all()})
return dict_
...
views.py部分与经理使用:
...
class ProductListView(ContextMixin, View):
template_name = 'myList/myList.html'
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
product = kwargs.get('product')
if product not in {'film', 'game', 'series', 'book'}:
raise Http404
context = self.get_context_data()
context['title'] = f'Список {product}'
context['dict_queryset'] = Product.objects.separated_by_status(product)
return render(request, self.template_name, context)
...
django 调试工具栏结果: here
问题是查询在管理器中是惰性执行的,但在模板中它已经为每个 PRODUCT_STATUS 元素单独完全执行。如何优化执行 1 次?
如果我用错了“懒惰”这个词,我很抱歉。
问题不是懒惰,问题是你做了一个QuerySet
per PRODUCT_STATUS
.
你可以用 groupby
function [Python-doc] of the itertools
module [Python-doc]:
from itertools import groupby
from operator import attrgetter
class ExtendedManager(models.Manager):
def separated_by_status(self, product_type):
query = super().get_queryset().order_by('status')
dict_ = {
k: list(vs)
for k, vs in <strong>groupby(</strong>query<strong>, attrgetter('status'))</strong>
}
return {
status1: dict_.get(status0, [])
for status0, status1 in PRODUCT_STATUS
}