Django REST: значение исключения: .filter_queryset () должно быть переопределено - PullRequest
0 голосов
/ 28 сентября 2018

Я попытался создать новую установку моей кодовой базы и столкнулся с этой проблемой.Как можно лучше, я попытался проверить, что обе установки имеют одинаковые точные версии всех зависимостей.

Проблема, похоже, возникает только на конечных точках, которые обращаются к базе данных, хотя, возможно, это просто совпадение ивопрос вообще не связан с БД.(БД определенно функционирует, потому что старая установка все еще может получить к ней доступ.)

Дайте мне знать, если есть какая-либо другая полезная информация, которую я могу собрать для отладки.

Traceback:
File "venv/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "venv/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)
File "venv/lib/python2.7/site-packages/rest_framework/viewsets.py" in view
  87.             return self.dispatch(request, *args, **kwargs)
File "venv/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  466.             response = self.handle_exception(exc)
File "venv/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  463.             response = handler(request, *args, **kwargs)
File "venv/lib/python2.7/site-packages/rest_framework/mixins.py" in retrieve
  56.         instance = self.get_object()
File "venv/lib/python2.7/site-packages/rest_framework/generics.py" in get_object
  84.         queryset = self.filter_queryset(self.get_queryset())
File "venv/lib/python2.7/site-packages/rest_framework/generics.py" in filter_queryset
  151.             queryset = backend().filter_queryset(self.request, queryset, self)
File "venv/lib/python2.7/site-packages/rest_framework/filters.py" in filter_queryset
  31.         raise NotImplementedError(".filter_queryset() must be overridden.")

Exception Type: NotImplementedError at /my/endpoint
Exception Value: .filter_queryset() must be overridden.

Вотмой список пакетов от pip list:

Package                            Version
---------------------------------- ----------
argcomplete                        0.8.1
asn1crypto                         0.24.0
backports.shutil-get-terminal-size 1.0.0
beautifulsoup4                     4.3.2
cffi                               1.11.5
cryptography                       2.3.1
Cython                             0.28.5
decorator                          4.3.0
Django                             1.8.4
django-cors-headers                1.1.0
django-filter                      0.11.0
djangorestframework                3.2.3
djangorestframework-jwt            1.7.1
dxpy                               0.161.0
enum34                             1.0.4
fusepy                             2.0.2
futures                            3.0.3
gunicorn                           19.3.0
idna                               2.0
impyla                             0.10.0
ipaddress                          1.0.14
ipdb                               0.11
ipython                            5.8.0
ipython-genutils                   0.2.0
kazoo                              2.2.1
Markdown                           2.6.2
MySQL-python                       1.2.5
ndg-httpsclient                    0.4.0
pathlib2                           2.3.2
pexpect                            4.6.0
pickleshare                        0.7.4
pip                                18.0
prompt-toolkit                     1.0.15
psutil                             2.1.3
ptyprocess                         0.6.0
pyasn1                             0.1.8
pycparser                          2.14
Pygments                           2.2.0
PyJWT                              1.4.0
pymssql                            2.2.0.dev0
pyodbc                             4.0.24
pyOpenSSL                          17.5.0
python-dateutil                    2.3
python-magic                       0.4.6
requests                           2.7.0
scandir                            1.9.0
setuptools                         40.0.0
simplegeneric                      0.8.1
six                                1.9.0
SQLAlchemy                         1.2.11
thrift                             0.9.2
traitlets                          4.3.2
wcwidth                            0.1.7
WebHDFS                            0.2.0
wheel                              0.24.0
ws4py                              0.3.2
xattr                              0.6.4

Вот мои остальные настройки фреймворка.Я начинаю думать, что использование BaseFilterBackend является началом проблемы.Похоже, этот класс содержит метод filter_queryset(), который не перезаписывается:

REST_FRAMEWORK = {
     'DEFAULT_PERMISSION_CLASSES': (
         'rest_framework.permissions.IsAuthenticated',
     ),
     'DEFAULT_AUTHENTICATION_CLASSES': (
         'rest_framework.authentication.SessionAuthentication',
         'rest_framework.authentication.BasicAuthentication',
         'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
     ),
     'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.BaseFilterBackend',),
     'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
  }

РЕДАКТИРОВАТЬ: Вот представление, вызывающее ошибку:

 from rest_framework import permissions
 from rest_framework import renderers
 from rest_framework import viewsets, mixins
 from models import MyModel

 from rest_framework.response import Response

 from rest_framework.renderers import JSONRenderer
 from rest_framework.parsers import JSONParser

 from rest_framework import generics
 from rest_framework import filters

 import six

 class MyViewSet(viewsets.ModelViewSet):

     queryset = MyModel.objects.all()
     serializer_class = MyModelSerializer

     #Allows to filter using URL params and sorting
     filter_backends = (filters.BaseFilterBackend, filters.OrderingFilter)
     ordering = ('CreatedAt',)
     filter_fields = ('Modelfield1', 'Modelfield2',)

1 Ответ

0 голосов
/ 02 октября 2018

В ваших настройках вы установили DEFAULT_FILTER_BACKENDS' на ('rest_framework.filters.BaseFilterBackend',).Таким образом, BaseFilterBackend применяется к большинству ваших представлений * и выбрасывает NotImplementedError, потому что BaseFilterBackend является базовым классом, который фактически не предназначен для непосредственного применения - только для того, чтобы быть переопределенным вами или унаследованным другими фильтрами.Вы должны удалить его из настроек по умолчанию и везде, где вы его используете.

* За исключением тех, которые вручную задают свои фильтры с помощью filter_backends, как вы делали это в вашем примере.

ДляНапример, ошибку можно устранить, заменив BaseFilterBackend на DjangoFilterBackend в настройках и в представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...