почему я получаю ошибку атрибута base_name, когда я включаю свое представление в файл url.py веб-службы django Mongoengine?

Я пытаюсь использовать django-rest-framework-mongoengine для создания веб-сервиса с использованием Django и mongodb.

У меня возникает ошибка, когда я включаю URL-адрес, в котором перечислены мои объекты типа Document.

Мой файл модели

class Job(Document):
    title = StringField(required=True)
    state = StringField(required=True)

мое мнение

class JobViewSet(GenericAPIView):
    queryset = Job.objects.all()
    serializer_class = JobSerializer

Мой файл URL

router = routers.MongoSimpleRouter()
router.register(r'jobs', views.JobViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

мой сериализатор

class JobSerializer(DocumentSerializer):
    class Meta:
        model = Job
        fields = ('title', 'state')

Я получаю следующую ошибку, когда запускаю сервер

`base_name` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.model` attribute.

Я пробовал другой тип просмотра, но все та же ошибка. Любая помощь приветствуется....

Я использую

python 2.7.9
Django==1.7.7 
django-rest-framework-mongoengine==2.0.2    
mongoengine==0.9.0

вот полный стек

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/

Django Version: 1.7.7
Python Version: 2.7.9
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'romeo',
 'mongoengine.django.mongo_auth',
 'jobs',
 'rest_framework',
 'rest_framework_mongoengine')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  98.                 resolver_match = resolver.resolve(request.path_info)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  343.             for pattern in self.url_patterns:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/urlresolvers.py" in url_patterns
  372.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/urlresolvers.py" in urlconf_module
  366.             self._urlconf_module = import_module(self.urlconf_name)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py" in import_module
  37.     __import__(name)
File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_imps/_pydev_pluginbase.py" in plugin_import
  452.                                    fromlist, level)
File "/Users/amer/Workspace/Repository/romeo/romeo/urls.py" in <module>
  6. router.register(r'jobs', views.JobViewSet)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/rest_framework/routers.py" in register
  60.             base_name = self.get_default_base_name(viewset)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/rest_framework_mongoengine/routers.py" in get_default_base_name
  11.         assert model_cls, '`base_name` argument not specified, and could ' \

Exception Type: AssertionError at /
Exception Value: `base_name` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.model` attribute.



Ответы (2)


Вам нужно добавить параметр base_name, чтобы он работал:

router = routers.MongoSimpleRouter()
router.register(r'jobs', views.JobViewSet, 'job-view')

Я пробую это (из ответа Гео Джейкоба), но это не работает:

router.register(r'jobs', views.JobViewSet, base_name='job-view')

Примечание: обратите внимание на разницу между base_name='job-view' и 'job-view'

person Giovanni Benussi    schedule 30.09.2016
comment
Это очень простая проблема с Python, но на мгновение забывают о языковых проблемах и начинают обвинять маршрутизаторы, представления и т. д. Спасибо за замечание! - person chachan; 13.02.2017

Попробуйте добавить base_name в реестр маршрутизатора.

router = routers.MongoSimpleRouter()
router.register(r'jobs', views.JobViewSet, base_name='job-view')
person Geo Jacob    schedule 02.04.2015
comment
Я пробовал это, и это не сработало. Я попробовал base_name='JobViewSet'. Я получаю ошибку "страница не найдена". Используя конфигурацию URL, определенную в romeo.urls, Django попробовал эти шаблоны URL в следующем порядке: ^api-auth/ Текущий URL не соответствует ни одному из них. Как будто регистрация больше не происходит - person Amer; 02.04.2015
comment
попробуйте наследоваться от viewsets.ModelViewset. И если не работает, вставьте свою ошибку и полный код. - person Geo Jacob; 02.04.2015
comment
Я сделал, и это не сработало. Я проследил код, и когда я вызываю router.register(r'jobs', views.JobViewSet, base_name='job'), он распознает базовое имя и выполняет self.registry.append((prefix, viewset, base_name)), который находится внутри router.register. проблема в том, что по какой-то причине он никогда не добавляет URL-адреса для задания. Я не уверен, как он определяет, как получить URL-адреса для этого представления/класса. Теперь ошибка: «Страница не найдена, так как не может найти /jobs/url». - person Amer; 02.04.2015
comment
Итак, я внес следующие изменения: я использую router = routers.MongoSimpleRouter(), а представление имеет тип rest_framework_mongoengine.viewsets.ModelViewSet, и это, похоже, работает. По крайней мере, он добавляет URL-адреса в мой маршрутизатор, но теперь я получаю следующую ошибку: объект QuerySet не имеет атрибута «модель». - person Amer; 02.04.2015
comment
Кстати, base_name, вероятно, должно быть установлено на имя класса, чтобы получить лучший URL-адрес. Я использовал base_name='Job' - person Amer; 02.04.2015
comment
Добавление «base_name» при регистрации URL-адреса сработало для меня. Я думаю, что в Django ›1.8 нужно упомянуть base_name. - person vinayakumarnk; 20.11.2017