网址:/user?u=root
有效
class UserFilter(django_filters.rest_framework.FilterSet):
u = django_filters.rest_framework.CharFilter(name='username', lookup_expr='contains')
class Meta:
model = User
fields = ['username','u']
但是当我把它改成
时class UserFilter(django_filters.rest_framework.FilterSet):
u = django_filters.rest_framework.CharFilter(name='username', lookup_expr=['contains'])
class Meta:
model = User
fields = ['username','u']
url:/user?u__contains=root
不起作用。
django 1.11.1 django-filter 1.0.4 djangorestframework 3.6.3
答案 0 :(得分:0)
Ykh很接近,但不正确。在第二个示例中,过滤器仍然显示为u
,因此按u__contains
过滤是无操作,因为它不是可识别的名称。 u__contains
不以某种方式转换为u__contains__contains
查找。
此外,将查找列表或元组传递给lookup_expr
可能会提供与您预期不同的行为。 与您使用Meta.fields
看到的自动过滤器生成无关 。相反,它会创建一个多查找过滤器(docs)。此过滤器有两个输入:
它使用django.forms.MultiWidget
来完成此操作,因此您的查询必须类似于/user?u_0=root&u_1=contains
。
通常,MultiWidget
与API使用不兼容,因为_0
和_1
后缀。
如果您尝试公开名为u__contains
的过滤器,则应执行以下操作:
class UserFilter(django_filters.rest_framework.FilterSet):
u = django_filters.rest_framework.CharFilter(name='username', lookup_expr='exact')
u__contains = django_filters.rest_framework.CharFilter(name='username', lookup_expr='contains')
class Meta:
model = User
fields = ['u', 'u__contains']