使用django rest框架进行序列化

时间:2015-02-11 18:42:05

标签: python django django-rest-framework

我有一个名为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/时,我收到此消息错误:

enter image description here

我可以做些什么?

1 个答案:

答案 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参数用于指定视图名称模式的初始部分。

文档继续进一步解释为什么你会遇到这个问题,甚至包括一个例子,以及如何解决它。