Admin.SimpleListFilter с именем related_query_name для фильтрации вхождений
Я пытаюсь отфильтровать элементы в списке администратора:
class Product(models.Model):
name = models.CharField("name", max_length = 128)
def associated_stores(self):
stores = set([f"""{s.number}""" for sin self.store_name.all()])
if len(stores) == 0:
return None
return ", ".join(stores)
class Store(models.Model):
products = models.ManyToManyField(Product, related_name = "%(class)s_name", related_query_name = "product_store_qs", blank = True)
number = ...
Теперь я хочу реализовать SimpleListFilter
, который может фильтровать в списке продуктов продукты, которые не доступны ни в одном магазине, или показывать названия магазинов:
class AssociatedStoresFilter(admin.SimpleListFilter):
title = "associated stores"
parameter_name = "assoc_stores"
def lookups(self, request, model_admin):
return [(True, "yes"), (False, "no")]
def queryset(self, request, queryset):
qs = queryset.annotate(assoc_stores = Case(When(product_store_qs__isnull = False, then = 1), default = 0))
if self.value() == "False":
return qs.filter(assoc_stores = 0)
elif self.value() == "True":
return qs.filter(assoc_stores = 1)
else:
return queryset
Фильтр по отсутствию товара в магазинах работает, но фильтр, в котором должны быть показаны только товары, доступные в магазине, показывает одну запись для каждого магазина товара (со всеми магазинами), вместо только одной записи (со всеми магазинами).
Как сократить результаты, чтобы каждый продукт после фильтрации сохранялся только один раз?