或使用django过滤器对多个回波进行过滤

或使用django过滤器对多个回波进行过滤,django,django-filter,Django,Django Filter,我有一个表单字段,有[1,2,3,4+]这样的选项,4+表示大于等于,可以选择多个选项。我想使用django过滤器进行过滤 我可以对[1,2,3]进行筛选,但我不知道如何或使用gte=4进行筛选 以下两项工作都用于过滤[1,2,3]: class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter): pass class PlanFilter(FilterSet): obj = dja

我有一个表单字段,有[1,2,3,4+]这样的选项,4+表示
大于等于
,可以选择多个选项。我想使用
django过滤器
进行过滤

我可以对[1,2,3]进行筛选,但我不知道如何
使用
gte=4
进行筛选

以下两项工作都用于过滤[1,2,3]:

class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
    pass

class PlanFilter(FilterSet):
    obj = django_filters.NumberInFilter(name='object', lookup_expr='in')
    class Meta:
        model = Plan 
        fields= ['object',]


因此,如何使用
gte=4
字段过滤多个选项?

任何一个选项都只需要对过滤逻辑进行最小的更改

自定义
.filter()
方法,用于
NumberInFilter
class NumberFilter(django_filters.BaseInFilter、django_filters.NumberFilter):
def过滤器(自身、qs、值):
#基于CSV的筛选器接收值列表
如果4没有价值:
返回super(NumberInFilter,self).filter(qs,value)
值。删除(4)
#稍微详细一点,但不需要硬编码名称。
#例如,`qs.filter(Q(object_uin=value)| Q(object_ugte=4))`
q1=Q(**{'%s_uuu%s%%(self.name,'in'):value})
q2=Q(**{'%s_uuu%s'(self.name,'gte'):4})
返回qs.过滤器(q1 | q2)
重写
中的
多回音过滤
objectmultiplechicefilter(django_filters.multiplechicefilter):
def get_filter_谓词(self,value):
如果值=='4':
返回{%s_ugte'%self.name:4}
返回super(objectmultiplechicefilter,self).get\u filter\u谓词(值)

谢谢,这两个函数都有细微的变化:
super()
需要有参数,
super(NumberInFilter,value)
。而
if value==4
必须是
if value==u'4'
。不过我有一个问题,如果我在视图中添加
get_queryset()
方法,我会在
返回super(NumberInFilter,value)。filter(qs,value)
上的
NumberInFilter
上出错。错误:
super(类型,obj):obj必须是类型
的实例或子类型。我如何解决它?关于值的观点很好。您可以使用
TypedMultipleChoiceFilter
来解决这个问题。至于
super()
调用,python 3接受无参数版本。在Python2中,必须传递类和self值。在您的情况下,您传递了
,但需要传递
self
。例如,
super(NumberInFilter,self)
choices= ( 
         (1,1),
         (2,2),
         (3,3),
         )

class PlanFilter(FilterSet):
    obj = django_filters.MultipleChoiceFilter(name='object', choices=choices) 
    ...