Be studied by a small project
############### models.py ###############
from django.db import models class Publish(models.Model): name=models.CharField(max_length=32) email=models.EmailField() def __str__(self): return self.name class Author(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() def __str__(self): return self.name class Book(models.Model): title=models.CharField(max_length=32) price=models.IntegerField() pub_date=models.DateField() publish=models.ForeignKey("Publish") authors=models.ManyToManyField("Author") def __str__(self): return self.title class User(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) type_choices=((1,"普通"),(2,"VIP"),(3,"SVIP")) user_type=models.IntegerField(choices=type_choices,default=1) class Token(models.Model): user=models.OneToOneField("User") token=models.CharField(max_length=128) def __str__(self): return self.token
############### serializers.py ###############
from rest_framework import serializers from api.models import * class PublishModelSerializers(serializers.ModelSerializer): class Meta(): model=Publish fields='__all__' class AuthorModelSerializers(serializers.ModelSerializer): class Meta(): model=Author fields='__all__' class UserModelSerializers(serializers.ModelSerializer): class Meta(): model=User fields='__all__' class BookModelSerializers(serializers.ModelSerializer): class Meta(): model=Book fields='__all__'
############### views.py ###############
from django.shortcuts import render from api.serializer import PublishModelSerializers,AuthorModelSerializers,UserModelSerializers,BookModelSerializers from rest_framework.views import APIView from rest_framework.response import Response from api import models from api.utils import TokenAuth,SVIPPermission,VisitRateThrottle,MyPageNumberPagination class Publisher(APIView): authentication_classes = [TokenAuth] permission_classes = [SVIPPermission] def get(self,request): publisher_all = models.Publish.objects.all() print(publisher_all) ps = PublishModelSerializers(publisher_all,many=True) return Response(ps.data) def post(self,request): ps = PublishModelSerializers(data=request.data) if ps.is_valid(): ps.save() return Response(ps.data) else: return Response(ps.errors) class PublisherDetail(APIView): def get(self,request,pk): publish = models.Publish.objects.filter(pk=pk).first() ps = PublishModelSerializers(publish) return Response(ps.data) def put(self,request,pk): publish = models.Publish.objects.filter(pk=pk).first() ps = PublishModelSerializers(publish,data=request.data) if ps.is_valid(): ps.save() return Response(ps.data) else: return Response(ps.errors) def delete(self,request,pk): models.Publish.objects.filter(pk=pk).delete() return Response() def get_random_str(user): import hashlib,time create_time =str(time.time()) md5=hashlib.md5(bytes(user,encoding='utf8')) md5.update(bytes(create_time,encoding='utf8')) return md5.hexdigest() class Login(APIView): authentication_classes = [] def post(self,request): name=request.data.get('name') pwd = request.data.get('pwd') print(request.data) user= models.User.objects.filter(name=name,pwd=pwd).first() print(user) print(user.name) ret ={'status_code':100,'msg':None} if user: random_str = get_random_str(user.name) print(random_str) token=models.Token.objects.update_or_create(user=user,defaults={'token':random_str}) ret['token']=str(token) else: ret['status_code']=1001 ret [ 'mag'] = 'user name or password is incorrect " return Response(ret) from rest_framework import mixins from rest_framework import generics from rest_framework import viewsets # The first view, the use of mixins class Author(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView): authentication_classes = [] queryset = models.Author.objects.all() serializer_class = AuthorModelSerializers def get(self,request,*args,**kwargs): return self.list(request,*args,**kwargs) def post(self,request,*args,**kwargs): return self.create(request,*args,**kwargs) class AuthorDetail(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView): authentication_classes = [] queryset = models.Author.objects.all() serializer_class = AuthorModelSerializers def get(self,request,*args,**kwargs): return self.retrieve(request,*args,**kwargs) def put(self,request,*args,**kwargs): return self.update(request,*args,**kwargs) def delete(self,request,*args,**kwargs): return self.destroy(request,*args,**kwargs) # The second view: the use of a common class-based view class User(generics.ListCreateAPIView,generics.GenericAPIView): authentication_classes = [] queryset = models.User.objects.all() serializer_class = UserModelSerializers class UserDetail(generics.RetrieveUpdateDestroyAPIView,generics.GenericAPIView): queryset = models.User.objects.all() serializer_class = UserModelSerializers # The third view: the two views are combined into a class, it would need to change the url as url or two now, class Book(viewsets.ModelViewSet): # throttle_classes = [VisitRateThrottle] queryset = models.Book.objects.all() serializer_class = BookModelSerializers pagination_class = MyPageNumberPagination
############### urls.py ###############
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/(?P<version>\w+)/', include("api.urls")), ]
from django.conf.urls import url,include from django.contrib import admin from api import views # But now there is a problem, as long as the future is not more than a table, you need two of the url? # This has ten tables should write ten times, so you encapsulates the view class, you also need to look at the package routing, # How packaging? from rest_framework import routers routers=routers.DefaultRouter() routers.register("book",views.Book) # Then have a table, you only need to register on it, # This together with this one: routers.register ( "authors", views.AuthorModelView) urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publish/$',views.Publisher.as_view()), url(r'^publish/(?P<pk>\d+)/$', views.PublisherDetail.as_view()), url(r'^login/$', views.Login.as_view()), url(r'^author/$', views.Author.as_view()), url(r'^author/(?P<pk>\d+)/$', views.AuthorDetail.as_view()), url(r'^user/$', views.User.as_view()), url(r'^user/(?P<pk>\d+)/$', views.UserDetail.as_view()), url(r'', include(routers.urls)), # url(r'^book/$', views.Book.as_view({"get":"list",'post':"create"})), # url(r'^book/(?P<pk>\d+)/$', views.Book.as_view({"get":"retrieve","put":"update","delete":"destroy"})), ]
############### settings.py ###############
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["api.utils.TokenAuth"], "DEFAULT_PERMISSION_CLASSES": ["api.utils.SVIPPermission"], 'ALLOWED_VERSIONS': [ 'v1', 'v2'], # version allowed 'VERSION_PARAM': 'version', # parameters 'DEFAULT_VERSION': 'v1', # default version }