【发布时间】:2016-02-19 04:12:22
【问题描述】:
这适用于 Django 1.8
models.py
class ProductClass(models.Model):
product_class = models.CharField(max_length=30)
def __unicode__(self):
return self.secondary_class
class Product(models.Model):
name= models.CharField(max_length=30)
product_class = models.ForeignKey(ProductClass, db_index=True)
def __unicode__(self):
return self.name
我想在 ProductAdmin 中显示一个列表过滤器,其中包含一个列表,如果产品分类与每个条目旁边的产品数量。
按产品类别
- 书籍 (100)
- 钢笔 (10)
- 统治者 (33)
我已经为超级数据集做到了这一点
admin.py
class DynamicProductClassFilter(admin.SimpleListFilter):
title = _('Product Class')
# Parameter for the filter that will be used in the URL query.
parameter_name = 'p_class'
def lookups(self, request, model_admin):
classes = ProductClass.objects.annotate(number_products=Count('product'))
return [(c.id, '%s (%s)' % (c.product_class , c.number_products)) for c in classes]
现在我想根据应用于数据集的其他过滤器更新此内容,无论是搜索条件还是其他正在应用的列表过滤器。
我认为我可以使用“请求”和“模型管理员”在列表过滤器的“定义查询集”中可用的事实。经过多次不同的尝试,我最终得到了以下代码
def lookups(self, request, model_admin):
products = model_admin.get_queryset(request)
product_ids = products.values_list('id', flat=True)
classes = ProductClass.objects.filter(product__id__in=product_ids).annotate(number_products=Count('product'))
return [(c.id, '%s (%s)' % (c.product_class, c.number_products)) for c in classes]
但不幸的是,这并没有将过滤器应用于主数据集。
我对 django 和 python 很陌生,所以如果这里缺少基本知识,我深表歉意。
【问题讨论】:
标签: django django-admin django-filters