在进行了接口视图类的封装后
我们的编码效率大大提高的同时
功能也越来越完善
但是每次在进行路由的编写的时候
as_view里都要给参数指定请求方式
这还是有些不便利的
于是路由组件就出现了
下面就贴代码:
在项目跟目录下:
url(r'^api',include('API.urls')),
先将我们的接口app路径写在主项目目录下
然后
在接口app的urls下
url(r'/',include(router.urls)),
再导入routes,注册路由,自动生成路径
from rest_framework import routers
router = routers.DefaultRouter()
router.register('books',views.BookView)
这是视图类
class BookView(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerialize
这是序列化类:
class BookSerialize(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['title','price','publish','author','publish_company','author_list']
extra_kwargs = {
'publish':{'write_only':True},
'author': {'write_only': True},
}
publish_company = serializers.CharField(read_only=True,source='publish.company',max_length=32)
author_list = serializers.SerializerMethodField()
def get_author_list(self,book_obj):
author_list = list()
for author in book_obj.author.all():
author_list.append(author.name)
return author_list
然后就可以访问了
再看看之前的路由
url(r'books/$',views.BookView.as_view({'get':'list','post':'create'}),name="books"),
url(r'books/(?P<pk>\d+)/$',views.BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'}),name="books_filter"),
是不是突然觉得使用了路由组件简便了好多
当然,路由组件还有其他的功能
当我访问一个错误的路径http://127.0.0.1:8000/api/book时
我们可以看到序号5 6 7 8自动生成的其他路由
这有什么用呢?
下图看效果
注意url
这样就直接返回json格式
当然,类似于put,delete,单个数据get的路由也自动生成了
到这里,路由组件的只是就分享完毕
路由组件的关键的router = routers.DefaultRouter()这句话,
DefaultRouter继承自SimpleRouter,其中的封装有兴趣的朋友可以去看看源码
注意,直接继承APIView的接口,无法使用这个组件