我遇到了一个问题,即由 django_filters.BooleanFilter 创建的布尔过滤器需要不同的查询参数与从模型继承的布尔过滤器。
从模型继承的布尔过滤器期望参数为真或假,由 BooleanFilter 创建的过滤器期望参数为:
1 - 翻译为“未设置”
2 - 翻译为“真”
3 - 翻译成“假”
这种行为使我们不清楚如何从 javascript 端处理 rest api 自定义过滤器。
示例代码:
模型.py:
class TestModel(models.Model):
first = models.BooleanField()
last = models.BooleanField()
api.py
`导入 django_filters
从 rest_framework 导入视图集、序列化器
从 .models 导入 TestModel
类 TestFilter(django_filters.rest_framework.FilterSet):
first_and_last = django_filters.BooleanFilter(method='first_and_last_filter')
def first_and_last_filter(self, queryset, name, value):
如果值==真:
返回 queryset.filter(first=True, last=True);
返回查询集;
元类:
模型 = 测试模型
字段 = ['first', 'last', 'first_and_last']
类 TestSerializer(serializers.ModelSerializer):
元类:
模型 = 测试模型
字段= ['第一个','最后一个']
类 TestViewSet(viewsets.ModelViewSet):
模型 = 测试模型
查询集 = TestModel.objects.all()
serializer_class = TestSerializer
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_fields = ('first', 'last', 'first_and_last', )
filter_class = TestFilter`
此处的测试视图集过滤器期望查询参数对于“first”和“last”字段为“true”或“false”,但对于“first_and_last”过滤器字段期望它为 1,2 或 3。
例如过滤查询冷是这样的:
/api/test/?first=true&first_and_last=2
这是我在实际项目中遇到的一个简化示例,自定义过滤器包含更复杂的逻辑。
我已经使用重现问题所需的所有代码设置了 repo。
https://github.com/inakrin/boolfilter
嗨@inakrin。 您应该从rest_framework
子包中导入filters
。
https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py
所以它可能应该在 DRF 文档中提到,因为他们建议从过滤器导入:
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
它当然适用于除 BooleanFilter 之外的所有情况。
最有用的评论
嗨@inakrin。 您应该从
rest_framework
子包中导入filters
。https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py