2015-02-11 114 views
0

我有名为Artist的模型,我想用Django Rest Framework公开这个模型来创建一个API并且可以使用这些数据。用Django Rest框架序列化

我创建了一个艺术家一类基于视图/ views.py命名ArtistViewSet

#CBV for rest frameworks 
from rest_framework import viewsets 

class ArtistViewSet(viewsets.ModelViewSet): 
    model = Artist 

我也有一个名为API/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 2015-02-11 19:06:16

+0

@norbertpy谢谢。我无法理解base_name的名称。我的意思是,这个基地名称是我创建的网址?我的视图ArtistViewSet没有queryset属性,由于这个原因,根据文档,它需要base_name参数,但我不知道该怎么做。对不起,这个新手问题。 – bgarcial 2015-02-11 19:29:23

回答

3

在Django REST框架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.

可注册ViewSet命名时自动生成的路由时使用可任意定义的base_name问。默认情况下,格式为[base]-list[base]-detail,其中[base]是可以定义的base_name。当您没有指定您自己的base_name,时,它会根据型号名称自动生成。由于必须为ViewSet实例定义queryset方法,因此这是检索模型(和更新的型号名称)的位置。由于您没有提供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.

的文档接着进一步解释究竟为什么你所得到的问题,甚至包括一个例子,以及如何解决它。

相关问题