我有一个名为Artist的模型,我想用Django Rest Framework公开这个模型来创建一个API,这个数据可以被消费。
我在artists / views.py中创建了一个名为ArtistViewSet的基于类的视图
#CBV for rest frameworks
from rest_framework import viewsets
class ArtistViewSet(viewsets.ModelViewSet):
model = Artist
我在urls.py文件中也有一个名为api /的url(查看名为api /的第三个url),用户可以访问上面提到的视图。
# 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/时,我收到此消息错误:
我可以做些什么?
答案 0 :(得分:3)
在Django REST框架2.4+(包括3.0+)中,已弃用并删除了视图的model
属性。这意味着您应该将视图定义为
from rest_framework import viewsets
class ArtistViewSet(viewsets.ModelViewSet):
queryset = Artist.objects.all()
哪个可以给你你期望的结果。现在,你在评论中提到了
我无法理解base_name的作用。我的意思是,这个基本名称是我创建的网址?我的视图集
ArtistViewSet
没有queryset
属性,因此,根据文档,必须放置base_name参数,但我不知道该怎么做。
在命名自动生成的路由时使用注册base_name
时可以选择定义的ViewSet
。默认情况下,格式为[base]-list
和[base]-detail
,其中[base]
是可以定义的base_name
。如果您未指定自己的base_name
,,则会根据型号名称自动生成。由于必须为queryset
实例定义ViewSet
方法,因此这是检索模型(以及更新的模型名称)的位置。由于您没有提供queryset
参数,Django REST框架会触发错误,因为它无法生成base_name
。
引用the documentation on routers
注意:
base_name
参数用于指定视图名称模式的初始部分。
文档继续进一步解释为什么你会遇到这个问题,甚至包括一个例子,以及如何解决它。