Я переопределяю Django Admin's list_filter
(чтобы настроить фильтр, который отображается справа на пользовательском интерфейсе администратора django для просмотра списка). Следующий код работает, но не оптимизирован: он увеличивает количество запросов SQL на «количество категорий продуктов».
(Частями, на которые следует обратить внимание в следующем примере кода, являются qs.values_list('product_category', flat=True)
, которые возвращают толькоid
(int), поэтому я должен использовать ProductCategory.objects.get(id=i)
.)
Хотите знать, если это можно упростить?
(Например, данные: предположим, категории продуктов "выпекаются" "жареные "сырые" и т. д., а элементы - это "хлеб", "жареная рыба", "пирог". Поэтому, когда список элементов отображается в Django Admin, все категории продуктов отображаются в столбце «Фильтровать по» с правой стороны. пользовательского интерфейса.)
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
from product_category.model import ProductCategory
class ProductCategoryFilter(SimpleListFilter):
title = _('ProductCategory')
parameter_name = 'product_category'
def lookups(self, request, model_admin):
qs = model_admin.get_queryset(request)
ordered_filter_obj_list = []
# TODO: Works, but increases SQL queries by "number of product categories"
for i in (
qs.values_list("product_category", flat=True)
.distinct()
.order_by("product_category")
):
cat = ProductCategory.objects.get(id=i)
ordered_filter_obj_list.append((i, cat))
return ordered_filter_obj_list
def queryset(self, request, queryset):
if self.value():
return queryset.filter(product_category__exact=self.value())
# P.S. Above filter is used in another class like so
class ItemAdmin(admin.ModelAdmin):
list_filter = (ProductCategoryFilter,)