所以我有我正在尝试做的和失败的简化版本。我有这个具有颜色字段的 Boxes 对象,并且可以通过 m2m 字段包含许多项目,所以我想要一个特定颜色框中所有项目的列表(一个查询集)。所以我为管理员制作了这个 django 过滤器。
from django.contrib.admin import SimpleListFilter
from store.models import Box
class Items(Model):
name = CharField(max_length=200)
class Box(Model):
items = ManyToManyField(Items)
color_choices = (
('yellow','yellow'),
('green','green'),
)
box_color = CharField(max_length=200,choices=color_choices)
# So in my Items admin list i want to filter the items by color, this is my 'failed' attemp.
class Items_by_payment_system_filter(SimpleListFilter):
title = _('Colors')
# Parameter for the filter that will be used in the URL query.
parameter_name = 'color'
def lookups(self, request, model_admin):
"""
Returns a list of tuples. The first element in each
tuple is the coded value for the option that will
appear in the URL query. The second element is the
human-readable name for the option that will appear
in the right sidebar.
"""
return Box.color_choices
def queryset(self, request, queryset):
# Remember that self.value contains the current selection in the filter options displayed to the user in Admin
if self.values():
boxes = Box.objects.filter(items__in=queryset) # get only boxes with the current set of items
boxes_ids = boxes.filter(box_color=self.values()).values_list('items__id',flat=True)
return queryset.filter(id__in=boxes_ids)
我不确定出了什么问题,因为管理员向我展示了属于与我选择的颜色不同的盒子的物品。