django-filter:typeError 在 /goods/ __init__() 得到一个意外的关键字参数 'name'



我正在学习Django REST框架。我想在 django rest 框架中使用 django 过滤器来选择我想要的结果。 我写了一个 filter.py 来获取价格介于 pricemin 和 pricemax 之间的商品:

class GoodsFilter(filters.FilterSet):
pricemin = filters.NumberFilter(name="shop_price", lookup_expr='gte')
pricemax = filters.NumberFilter(name="shop_price", lookup_expr='lte')
class Meta:
model = Goods
fields = ['pricemin', 'pricemax']

然后我在 view.py 中使用了这个过滤器:

class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
filter_backends = (DjangoFilterBackend,)
filter_class = GoodsFilter

当我运行我的项目时,出现如下错误:

TypeError at /goods/
__init__() got an unexpected keyword argument 'name'

我没有在我的代码中使用参数"name",所以我不知道这个错误。 追踪:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/goods/
Django Version: 2.0.3
Python Version: 3.6.4
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'DjangoUeditor',
'users.apps.UsersConfig',
'goods.apps.GoodsConfig',
'trade.apps.TradeConfig',
'user_operation.apps.UserOperationConfig',
'crispy_forms',
'xadmin',
'rest_framework',
'django_filters']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']

追踪:

File "C:UsersHarryEnvstestvir2libsite-packagesdjangocorehandlersexception.py" in inner
35.             response = get_response(request)
File "C:UsersHarryEnvstestvir2libsite-packagesdjangocorehandlersbase.py" in _get_response
128.                 response = self.process_exception_by_middleware(e, request)
File "C:UsersHarryEnvstestvir2libsite-packagesdjangocorehandlersbase.py" in _get_response
126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:UsersHarryEnvstestvir2libsite-packagesdjangoviewsdecoratorscsrf.py" in wrapped_view
54.         return view_func(*args, **kwargs)
File "C:UsersHarryEnvstestvir2libsite-packagesrest_frameworkviewsets.py" in view
103.             return self.dispatch(request, *args, **kwargs)
File "C:UsersHarryEnvstestvir2libsite-packagesrest_frameworkviews.py" in dispatch
483.             response = self.handle_exception(exc)
File "C:UsersHarryEnvstestvir2libsite-packagesrest_frameworkviews.py" in handle_exception
443.             self.raise_uncaught_exception(exc)
File "C:UsersHarryEnvstestvir2libsite-packagesrest_frameworkviews.py" in dispatch
480.             response = handler(request, *args, **kwargs)
File "C:UsersHarryEnvstestvir2libsite-packagesrest_frameworkmixins.py" in list
40.         queryset = self.filter_queryset(self.get_queryset())
File "C:UsersHarryEnvstestvir2libsite-packagesrest_frameworkgenerics.py" in filter_queryset
152.             queryset = backend().filter_queryset(self.request, queryset, self)
File "C:UsersHarryEnvstestvir2libsite-packagesdjango_filtersrest_frameworkbackends.py" in filter_queryset
94.         if not filterset.is_valid() and self.raise_exception:
File "C:UsersHarryEnvstestvir2libsite-packagesdjango_filtersfilterset.py" in is_valid
206.         return self.is_bound and self.form.is_valid()
File "C:UsersHarryEnvstestvir2libsite-packagesdjango_filtersrest_frameworkfilterset.py" in form
24.         form = super().form
File "C:UsersHarryEnvstestvir2libsite-packagesdjango_filtersfilterset.py" in form
258.             Form = self.get_form_class()
File "C:UsersHarryEnvstestvir2libsite-packagesdjango_filtersfilterset.py" in get_form_class
250.             for name, filter_ in self.filters.items()])
File "C:UsersHarryEnvstestvir2libsite-packagesdjango_filtersfilterset.py" in <listcomp>
250.             for name, filter_ in self.filters.items()])
File "C:UsersHarryEnvstestvir2libsite-packagesdjango_filtersfilters.py" in field
138.             self._field = self.field_class(label=self.label, **field_kwargs)
File "C:UsersHarryEnvstestvir2libsite-packagesdjangoformsfields.py" in __init__
330.         super().__init__(max_value=max_value, min_value=min_value, **kwargs)
File "C:UsersHarryEnvstestvir2libsite-packagesdjangoformsfields.py" in __init__
254.         super().__init__(**kwargs)
Exception Type: TypeError at /goods/
Exception Value: __init__() got an unexpected keyword argument 'name'

来自迁移到2.0 指南,

Filter.name重命名为Filter.field_name(#792(

筛选器名称已重命名为field_name,以消除筛选器在其 FilterSet 类上的属性名称与用于筛选目的的field_name的歧义。

因此,从django-filter==2.0开始,请使用field_name而不是name

class GoodsFilter(filters.FilterSet):
pricemin = filters.NumberFilter(field_name="shop_price",lookup_expr='gte')
pricemax = filters.NumberFilter(field_name="shop_price",lookup_expr='lte')
class Meta:
model = Goods
fields = ['pricemin', 'pricemax']

相关内容

最新更新