Django filter 如何将两个字段的值过滤为一个?
如何聚合这两个字段的结果并在django filter中显示为一个 让我们以这样一个模型为例:Django filter 如何将两个字段的值过滤为一个?,django-filter,Django Filter,如何聚合这两个字段的结果并在django filter中显示为一个 让我们以这样一个模型为例: class Animal(object): LEGS_CHOICES = (2, 4, 8) legs = models.PositiveSmallIntegerField(choices=LEGS_CHOICES) class Dog(Animal): pass class Spider(Animal): pass My django筛选器类: clas
class Animal(object):
LEGS_CHOICES = (2, 4, 8)
legs = models.PositiveSmallIntegerField(choices=LEGS_CHOICES)
class Dog(Animal):
pass
class Spider(Animal):
pass
My django筛选器类:
class AnimalFilterSet(django_filters.FilterSet):
legs = django_filters.MultipleChoiceFilter(choices=Animal.LEGS_CHOICES, widget=forms.CheckboxSelectMultiple())
class Meta:
model = Animal
fields = ['legs']
我想通过相同的字段过滤这两个模型,并将它们显示为一个
使用queryset,我可以这样做:
Animal.objects.filter(Q(dog__legs = 4) | Q(spider__legs = 4))
我写了我自己的过滤器
class MultiMultipleChoiceFilter(django_filters.Filter):
"""
This filter preforms an OR query on the selected options for defined fields.
"""
field_class = forms.MultipleChoiceField
def __init__(self, fields, *args, **kwargs):
super(MultiMultipleChoiceFilter, self).__init__(*args, **kwargs)
self.fields = fields
def filter(self, qs, value):
value = value or ()
if len(value) == len(self.field.choices):
return qs
q = Q()
for v in value:
for f in self.fields:
q |= Q(**{f: v})
return qs.filter(q).distinct()
使用示例。作为参数,输入字段列表
class AnimalFilterSet(django_filters.FilterSet):
legs = django_filters.MultiMultipleChoiceFilter(['dog__legs', 'spider__legs'], choices=Animal.LEGS_CHOICES, widget=forms.CheckboxSelectMultiple())
class Meta:
model = Animal
fields = ['legs']
这对我帮助很大,谢谢。但是,在django filter v.1.0.4中,表单标签在页面上呈现为[invalid field],除非我在FilterSet类中的字段def中包含一个显式的“label”选项。