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

标签 django django-rest-framework django-filter

我正在学习 Django REST 框架。我想在 django rest 框架中使用 django-filter 来选择我想要的结果。
我写了一个 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'

我没有在我的代码中使用参数“名称”,所以我不知道这个错误。
追溯:
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:\Users\Harry\Envs\testvir2\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\rest_framework\viewsets.py" in view
  103.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\rest_framework\views.py" in dispatch
  483.             response = self.handle_exception(exc)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\rest_framework\views.py" in handle_exception
  443.             self.raise_uncaught_exception(exc)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\rest_framework\views.py" in dispatch
  480.             response = handler(request, *args, **kwargs)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\rest_framework\mixins.py" in list
  40.         queryset = self.filter_queryset(self.get_queryset())

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\rest_framework\generics.py" in filter_queryset
  152.             queryset = backend().filter_queryset(self.request, queryset, self)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django_filters\rest_framework\backends.py" in filter_queryset
  94.         if not filterset.is_valid() and self.raise_exception:

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django_filters\filterset.py" in is_valid
  206.         return self.is_bound and self.form.is_valid()

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django_filters\rest_framework\filterset.py" in form
  24.         form = super().form

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django_filters\filterset.py" in form
  258.             Form = self.get_form_class()

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django_filters\filterset.py" in get_form_class
  250.             for name, filter_ in self.filters.items()])

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django_filters\filterset.py" in <listcomp>
  250.             for name, filter_ in self.filters.items()])

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django_filters\filters.py" in field
  138.             self._field = self.field_class(label=self.label, **field_kwargs)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django\forms\fields.py" in __init__
  330.         super().__init__(max_value=max_value, min_value=min_value, **kwargs)

File "C:\Users\Harry\Envs\testvir2\lib\site-packages\django\forms\fields.py" in __init__
  254.         super().__init__(**kwargs)

Exception Type: TypeError at /goods/
Exception Value: __init__() got an unexpected keyword argument 'name'

最佳答案

来自 Migrating to 2.0指南,

Filter.name renamed to Filter.field_name (#792)

The filter name has been renamed to field_name as a way to disambiguate the filter’s attribute name on its FilterSet class from the field_name used for filtering purposes.


所以,来自 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']

关于django-filter: TypeError at/goods/__init__() 得到一个意外的关键字参数 'name',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51850985/

相关文章:

html - 在 Django if/else 语句中用 CSS 替换图像

Django - 复选框数组

python - Django Rest Framework - 如何使用不同的查询参数格式?

django - 如何允许在所有字段上使用 djangorestframework 进行通用过滤?

python - 使用 django-filter 时在 Django 中向表单添加占位符

django - 验证 Django 管理内联表单集

python - Django 教程(使用 Heroku 上的指南), “Please supply the ENGINE value”(是的,我读过其他线程)

python - 如何限制django rest框架中的 Action

python - 对 DRF 序列化程序上的 ManyToMany 和 OneToMany 字段使用自定义模型管理器

django - Meta.fields 包含未在此 FilterSet : **** 上定义的字段