我的自定義 Manager 方法中的查詢延遲執行有問題。在其中我想通過模型 CharField 選擇來分離查詢并回傳 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 除錯工具列結果: 這里
問題是查詢在管理器中是惰性執行的,但在模板中它已經分別為每個 PRODUCT_STATUS 元素完全執行。cat 如何優化執行 1 次?
如果我錯誤地使用了“懶惰”這個詞,我感到非常抱歉。
uj5u.com熱心網友回復:
問題不在于懶惰,問題在于你做了一個QuerySet per PRODUCT_STATUS。
可以使這樣的字典,單次通過與groupby函式[Python的DOC]所述的itertools模塊[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 groupby(query, attrgetter('status'))
}
return {
status1: dict_.get(status0, [])
for status0, status1 in PRODUCT_STATUS
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/404915.html
標籤:
上一篇:如何訪問熊貓資料框中的嵌套資料?
下一篇:按排序順序在單鏈表中插入一個整數
