不能在django_filters类中使用lookup_expr列表?

时间:2017-05-26 06:50:40

标签: django django-rest-framework django-filter

网址:/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

1 个答案:

答案 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']