使用 django rest 框架序列化

Serializing with django rest framework

我有一个名为 Artist 的模型,我想使用 Django Rest Framework 公开这个模型以创建一个 API 并且可以使用此数据。

我在 artists/views.py 中创建了一个基于 class 的视图,名为 ArtistViewSet

#CBV for rest frameworks
from rest_framework import viewsets

class ArtistViewSet(viewsets.ModelViewSet):
    model = Artist

我在 urls.py 文件中也有一个名为 api/ 的 url(查看第三个 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/ 时,我收到此消息错误:

我会发生什么事?

在 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.

注册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.

该文档进一步解释了您遇到问题的确切原因,甚至包括一个示例,以及如何解决它。