django-rest-framework - 可以通过 django-filter URL 解析器做一个 `in` `lookup_type` 吗?

标签 django-rest-framework django-filter

我正在使用 django-filterdjango-rest-framework我正在尝试实例化一个过滤器,该过滤器接受用于过滤查询集的数字列表

class MyFilter(django_filters.FilterSet):   
    ids = django_filters.NumberFilter(name='id',lookup_type='in')
    class Meta:
        model = MyModel
        fields = ('ids',)

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    filter_class = MyFilter

如果我传入逗号分隔的整数列表,则过滤器将被完全忽略。

如果我传入一个整数,它会通过 django-filter 进入 django 的表单验证器并提示:
'Decimal' object is not iterable

有没有办法创建一个 django-filter 对象,它可以处理整数列表并正确过滤查询集?

最佳答案

无论好坏,我为此创建了一个自定义过滤器:

class IntegerListFilter(django_filters.Filter):
    def filter(self,qs,value):
        if value not in (None,''):
            integers = [int(v) for v in value.split(',')]
            return qs.filter(**{'%s__%s'%(self.name, self.lookup_type):integers})
        return qs

使用方式如下:
class MyFilter(django_filters.FilterSet):   
    ids = IntegerListFilter(name='id',lookup_type='in')
    class Meta:
        model = MyModel
        fields = ('ids',)

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    filter_class = MyFilter

现在我的界面接受以逗号分隔的整数列表。

关于django-rest-framework - 可以通过 django-filter URL 解析器做一个 `in` `lookup_type` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24041639/

相关文章:

django - Django 中的并发请求

Django REST 框架很慢

django - 使用 Django 中的多个字段进行计数(不同)

Django 查询 - 在带注释的计数过滤器中获取父对象

Django Rest Framework 多对多字段过滤器集

python - Django Rest Framework-有效地检索反向外键的相关字段

python - 如何使用 Django 和 rest_framework 通过 url 中的外键检索对象

python - Django Rest 框架异常处理程序的位置

python - 将 Textarea 用于 CSVWidget 和 django-filter

python - Django 过滤和删除