使用 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.
该文档进一步解释了您遇到问题的确切原因,甚至包括一个示例,以及如何解决它。
我有一个名为 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 aqueryset
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.
该文档进一步解释了您遇到问题的确切原因,甚至包括一个示例,以及如何解决它。