一.創建項目
1.創建 項目 :
django-admin startprojet drf
2. 創建 兩個app ------ app1 ,book
python manage.py startapp app1
python manage.py startapp book
3. settings 配置 ,一定不能少了 rest_framework 這個app的注冊。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'book',
'app1',
]
# 連接數據庫 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'book', # 數據庫名 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'PASSWORD':'123' # 這里必須為字符串 } }
4. 主應用中 __init__.py 文件中:
import pymysql pymysql.install_as_MySQLdb()
5. bookapp 中的 model.py 中建表
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32,verbose_name='書名') pub_date = models.DateField(verbose_name='出版日期') bread = models.IntegerField(verbose_name='閱讀量') bcomment = models.IntegerField(verbose_name='評論數') class Meta: db_table ='book' def __str__(self): return self.title class Hero(models.Model): name = models.CharField(max_length=32,verbose_name='名字') age = models.IntegerField(verbose_name='年齡') class Meta: db_table='人物' def __str__(self): return self.name
6. 數據庫遷移。
python manage.py makemigrations
python manage.py migrate
7. 在表中錄入數據。
接口實現
1.在app1 先創建serializers.py 文件
from rest_framework import serializers from book.models import Book,Hero class BookModelSerializer(serializers.ModelSerializer): class Meta: model = Book fields='__all__' # 可以給模型序列化器里面指定的字段設置限制選項 extra_kwargs = { 'bread':{'min_value':0,'required':True} } class HeroModelSerializer(serializers.ModelSerializer): class Meta: model = Hero fields = '__all__'
2. app1 views.py 創建視圖
from django.shortcuts import render # Create your views here. from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from app1.serializers import BookModelSerializer, HeroModelSerializer from book.models import Book, Hero class BookModelViewSet(ModelViewSet): queryset = Book.objects.all() serializer_class = BookModelSerializer @action(methods=['get'],detail=False)#detail=False 是否為詳情頁數據 def get_top_5(self,request): # 其接口 http://127.0.0.1:8000/app1/book/get_top_5/ # 獲取閱讀量最多的5條數據 books = Book.objects.order_by('-bread')[:5] # 取閱讀量為前5的書籍 serializer = BookModelSerializer(instance=books,many=True) return Response(serializer.data) # action是drf提供的路由和視圖方法綁定關系的裝飾器 # from rest_framework.decorators import action # 參數1: methods 列表,設置視圖方法允許哪些http請求訪問進來 # 參數2: detail 當前是否方法是否屬於詳情頁視圖, # False,系統不會自動增加pk在生成的路由地址中 # True 則系統會自動增加pk在生成的路由地址 @action(methods=['get','post'],detail=True) def get_one_title(self,request,pk): book = Book.objects.get(pk=pk) return Response(book.btitle) class HeroModelViewSet(ModelViewSet): queryset = Hero.objects.all() serializer_class = HeroModelSerializer
3. 配置路由
1.app1 應用下創建一個路由文件 urls.py
from rest_framework import routers from app1.views import BookModelViewSet, HeroModelViewSet urlpatterns=[] router = routers.DefaultRouter() # 開發環境用,有主界面 # router = routers.SimpleRouter() # 生產環境用 router.register('book',BookModelViewSet) router.register('hero',HeroModelViewSet) urlpatterns += router.urls
2.主應用下 urls.py 文件中
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('app1/',include('app1.urls')) ]
經過上面的創建完成了 book表和hero 表的增刪改查功能的API接口的實現。
DefaultRouter()的區別 SimpleRouter()
DefaultRouter() 可以多返回一個主頁面,而 simleRouter 沒有以下的頁面。