目录
为接口提供一个主页
为序列化类增加url
配置全局分页
- 为接口提供一个主页
目前在浏览器中进行的测试,我们都是通过输入完整url来跳转网页,当提供的url变多时,难免会忘记哪些url是有效的。为了避免这种情况,我们为BrowserAPI提供一个主页,来引导我们测试。
为每个url都增加一个参数name。
urlpatterns = [
url(r'^snippets/$', views.SnippetList.as_view(), name='snippet-list'),
url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view(), name='snippet-detail'),
url(r'^users/$', views.UserList.as_view(), name='user-list'),
url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view(), name='user-detail')
]
在myapp下新建一个api_path.py
在myapp/api_path.py增加主页的view
from rest_framework.reverse import reverse
from rest_framework.response import Response
from rest_framework.decorators import api_view
@api_view(['GET'])
def api_root(request, format=None):
return Response({
'users': reverse('user-list', request=request, format=format),
'snippets': reverse('snippet-list', request=request, format=format)
})
完成这个功能只需要一个简单的FBV提供GET方法即可,这个view将返回所有有效的url(通过JSON格式)。
reverse方法通过url的名字,返回一个完整的url。
在myapp/api_path.py配置主页的url
尽量不要使用任何正则式,保证我们直接访问最原始的url就可以访问的接口的主页。
养成好习惯,为每个url都增加参数name。
urlpatterns = format_suffix_patterns([
url(r'^$', views.api_root, name='api-index'),
...
])
配置后的接口主页
现在可以直接通过点击链接访问有效的url了,但是不要忘记当我们增加新的url后,要在主页的view中进行配置。
- 为序列化类增加url
现在我们的json数据,表的关系是通过id联系的,现在我们希望用url代替id。
在snippet/serializers.py更改序列化类
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
...
highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')
class Meta:
...
fields = ('url', 'highlight', ...)
class UserSerializer(serializers.HyperlinkedModelSerializer):
snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True)
class Meta:
...
fields = ('url', ...)
将ModelSerializer改为HyperlinkedModelSerializer。
在继承后,就自动会增加一个字段url,但是需要手动配置到fields中
为普通字段提供了HyperlinkedIdentityField,为外键字段提供了HyperlinkedRelatedField。其中最关键的参数view_name的值是url的参数name,也就是通过url配置中的name来获取到对应的url。
- 配置全局分页
在drf_tutorial/settings.py配置分页
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}