from django.db import models
class Publisher(models.Model):
name=models.CharField(max_length=32,verbose_name="名称",unique=True)
address=models.CharField(max_length=128,verbose_name="地址")
operator=models.ForeignKey("auth.User",on_delete=models.CASCADE)
def __str__(self):
return self.name
class Meta:
verbose_name="出版社"
verbose_name_plural=verbose_name
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name="书名")
publisher=models.ForeignKey("Publisher",on_delete=models.CASCADE)
def __str__(self):
return self.title
class Meta:
verbose_name="书"
verbose_name_plural=verbose_name
序列化
from rest_framework import serializers
from app001 import models
class PublisherSerializer(serializers.ModelSerializer):
operator=serializers.ReadOnlyField(source="operator.username")#重写operator获取用户名
class Meta:
model=models.Publisher #说明model用的是哪个model
fields=(#说明字段有哪些
"id",
"name",
"address",
"operator"
)
class BookSherializer(serializers.HyperlinkedModelSerializer): 超链接API最主要的是这一步模型继承的是HyperlinkedModelSerializer
class Meta:
model=models.Book
fields=(
"id",
"title",
"publisher"
)
视图
from app001 import serializers
from app001 import models
from rest_framework import generics
from rest_framework import permissions
from app001.permission import IsOwnerOrReadOnly
class PublisherList(generics.ListCreateAPIView):
queryset = models.Publisher.objects.all()
serializer_class = serializers.PublisherSerializer
permission_classes = (permissions.IsAuthenticated,IsOwnerOrReadOnly)#权限IsAuthenticated必须登录,后面是自定义权限
def perform_create(self,serializer):
serializer.save(operator=self.request.user) #默认把发请求的用户设置成录入人员
class PublisherDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Publisher.objects.all()
serializer_class = serializers.PublisherSerializer
permission_classes = (permissions.IsAuthenticated,IsOwnerOrReadOnly)#权限IsAuthenticated必须登录,后面是自定义权限
class BookList(generics.ListCreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializers.BookSherializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class BookDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Book.objects.all()
serializer_class = serializers.BookSherializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
//为我们的api创建一个根路径,然后在路由中进入/api显示出所有的API
@api_view(['GET'])
def api_root(request,format=None):
return Response({
'publishers':reverse('publisher-list',request=request,format=format),
'books':reverse('book-list',request=request,format=format)
})
路由
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url(r'^api/',include("app001.urls")),
url(r'^admin/',admin.site.urls)
]
from django.conf.urls import url,include
from rest_framework.urlpatterns import format_suffix_patterns
from app001 import views
urlpatterns = [
url(r'^$',views.api_root),
url(r'^publishers/$',views.PublisherList.as_view(),name="publisher-list"),
url(r'^publishers/(?P<pk>[0-9]+)/$',views.PublisherDetail.as_view(),name="publisher-detail"),
url(r'^books/$',views.BookList.as_view(),name="book-list"),
url(r'^books/(?P<pk>[0-9]+)/$',views.BookDetail.as_view(),name="book-detail"),
url(r'^api-auth/',include('rest_framework.urls',namespace='rest_framework'))
]
urlpatterns = format_suffix_patterns(urlpatterns)