1.创建 项目 :
django-admin startprojet drf
2. 创建 两个app ------ app1 ,book
python manage.py startapp app1
python manage.py startapp book
3. settings 配置
INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘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. 在表中录入数据。
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__‘
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
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 没有以下的页面。
原文:https://www.cnblogs.com/knighterrant/p/10562071.html