Restframework从入门到精通(四):Restframework之超链接API

235 阅读1分钟

演示前配置

拿外键的例子来说,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),

运行项目,可见运行成功