2015-02-11 2 views
0

У меня есть модель с именем Artist, и я хочу разоблачить эту модель с помощью Django Rest Framework для создания API, и эти данные могут быть использованы.Сериализация с каркасом отдыха django

Я создал на основе представление класса в художниках/views.py имени ArtistViewSet

#CBV for rest frameworks 
from rest_framework import viewsets 

class ArtistViewSet(viewsets.ModelViewSet): 
    model = Artist 

У меня также есть URL с именем апи/в файле urls.py (просмотреть третий URL по имени API /), который пользователь мог получить доступ к вышеуказанному виду.

# coding=utf-8 
from django.conf.urls import patterns, include, url 
from django.conf import settings 
from django.contrib import admin 
admin.autodiscover() 

from rest_framework import routers 
from artists.views import ArtistViewSet 

#I create a router by default 
router = routers.DefaultRouter() 

#Register the model 'artists' in ArtistViewSet 
router.register(r'artists', ArtistViewSet) 

urlpatterns = patterns('', 

    (r'^grappelli/', include('grappelli.urls')), # grappelli URLS 
    url(r'^admin/', include(admin.site.urls)), 

    #Include url api/ with all urls of router 
    url(r'^api/', include(routers.urls)), 

) 

Когда я иду в браузер и тип http://localhost:8000/api/ я получаю эту ошибку сообщение:

enter image description here

Что может быть случилось со мной?

+0

Необходимо указать 'base_name'. Прочтите [Маршрутизаторы] (http://www.django-rest-framework.org/api-guide/routers/). В нем конкретно упоминается ошибка, которую вы получили. – norbertpy

+0

@norbertpy спасибо. Я не могу понять rol base_name. Я имею в виду, это базовое имя - это URL, который я создал? Мой viewet ArtistViewSet не имеет атрибута queryset, из-за этого, согласно документации, необходимо поместить аргумент base_name, но я не знаю, как это сделать. Извините меня за вопрос новичков. – bgarcial

ответ

3

В Django REST framework 2.4+ (включая 3.0+) атрибут model для просмотров устарел и удален. Это означает, что вы должны определить свое мнение как

from rest_framework import viewsets 

class ArtistViewSet(viewsets.ModelViewSet): 
    queryset = Artist.objects.all() 

Это должно дать вам результат, который вы ожидаете. Теперь вы спросили в комментариях

I cannot understand the role of base_name. I mean, this base name is the url that I've created? My viewset ArtistViewSet does not have a queryset attribute, due to this, according to documentation, it's necessary put the base_name argument, but i don't know how to do it.

base_name, которые могут быть дополнительно определены при регистрации ViewSet используется при именовании автоматически сгенерированные маршруты. По умолчанию формат [base]-list и [base]-detail, где [base] - это base_name, который может быть определен. Если вы не указали свой собственный base_name, автоматически генерируется на основе модели. Поскольку метод queryset должен быть определен для экземпляров ViewSet, это то, где извлекается модель (и более поздняя модель). Поскольку вы не указали аргумент queryset, инфраструктура Django REST запускает ошибку, поскольку она не может генерировать base_name.

Цитирую the documentation on routers

Note: The base_name argument is used to specify the initial part of the view name pattern.

документация продолжает далее объяснять, почему именно вы получаете вопрос, даже в том числе, например, и как это исправить.

Смежные вопросы