演示前配置
拿外键的例子来说,Book
的外键是Publish
,点击Book
的超链接API
就可以访问到外键的Publish
为了方便演示,我这里我就创建一个新的表Book
,添加一个model
字段
models.py
class Book(models.Model):
title=models.CharField(max_length=20,verbose_name="图书名称",unique=True)
publish=models.ForeignKey("Publish",on_delete=True)
def __str__(self):
return self.title
class Meta:
verbose_name="书籍"
verbose_name_plural=verbose_name
修改完model
字段要makemigrations
->migrate
然后添加一个新的序列化文件
serializer.py
from .models import Publish,Book
......
class Bookserializer(serializers.ModelSerializer):
#通过publish这个外键去找到publish这个表的name
publish=serializers.StringRelatedField(source="publish.name")
class Meta:
model = Book
fields = (
"id",
"title",
"publish"
)
接下来要编写视图views文件
views.py
from .models import Publish,Book
from .serializers import Publishserializer,Bookserializer
.......
class Book_list(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = Bookserializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class Book_Detail(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = Bookserializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
最后要编写路由方
urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
#Publish的API
url(r'^publish/$',Publish_list.as_view()),
url(r'^publish/(?P<pk>[0-9]+)/$',PublisherDetail.as_view()),
#Book的API
url(r'^Book/$', Book_list.as_view()),
url(r'^Book/(?P<pk>[0-9]+)/$', Book_Detail.as_view()),
]
运行项目可以看到项目运行成功,且post请求等都可以运行
这篇博客讲的就是要把publish外键字段的弄一个超链接,点击可以查看这个出版社的所有字段
即点击这上那个字段都可以跳转到出版社的API情况
配置超链接
配置超链接十分的简单,只需要序列化字段的类修改为HyperlinkedModelSerializer
和删掉刚刚配置的publish=serializers.StringRelatedField(source="publish.name")
serializers.py
class Bookserializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Book
fields = (
"id",
"title",
"publish"
)
urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',api_root),
#Publish的API
url(r'^publish/$',Publish_list.as_view(),name='publish-list'),
url(r'^publish/(?P<pk>[0-9]+)/$',PublisherDetail.as_view(),name='publish-detail'),
#Book的API
url(r'^Book/$', Book_list.as_view(),name='Book-list'),
url(r'^Book/(?P<pk>[0-9]+)/$', Book_Detail.as_view(),name='Book-detail'),
]
配置完运行项目,可以看到已经配置好了超链接
显示所有可用的API
我们需要一个路由,打开可以显示所有可用的API
文档有这个方法的详细说明
依照文档的意思就是要在视图文件里面添加这个字段
views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse
......
@api_view(['GET'])
def api_root(request, format=None):
return Response({
'publish': reverse('publish-list', request=request, format=format),
'Book': reverse('Book-list', request=request, format=format)
})
然后我们配置一下路由
urls.py
#api_root的路由
url(r'^$',api_root),
运行项目,可见运行成功