目录

简介

Django是一套完善而强大的web开发框架, 结合Django Restframework我们可以非常快的搭建一套后台的api, 该api主要特点:

  • 标准的Restful接口, 支持增删改查

    每个模型分列表和详情两种接口, 列表GET获取列表/POST新建,详情接口GET获取详情/PUT修改/DELETE删除
  • 所有接口自带权限认证

    使用Basic Auth, 详细权限可以通过Admin配置

而我们只需要设计好我们的Models(数据模型)

实现步骤

1. 环境搭建

使用Python3+Django2.1+Django Restframework

pip3 install django
pip3 install djangorestframework

2. 创建项目及应用

创建一个名为django_shop的项目,进入项目目录,创建一个名为shop的应用

django-admin startproject django_shop
cd django_shop
python3 -m manage.py startapp shop

3. 在项目设置中注册我们的应用及rest_framework

修改项目目录下django_shop/settings.py文件

INSTALLED_APP列表中增加两行, 注册应用及rest_framework框架

INSTALLED_APPS = [
...
'shop.apps.ShopConfig',
'rest_framework'
]

文件末尾增加如下REST_FRAMWORK配置, 以使Api权限生效

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
]
}

4. 设计和编写Models(数据模型)

Models设计实际上就是数据库表设计, 一个Model对应一张数据库表, 数据模型(数据库表)的设计是一个项目的核心, 我们需要考虑:

  • 需要哪些模型(表)?
  • 每个表包含什么字段?
  • 表与表之间的相互关系(一对多/一对一/多对多)

我们这里设计4个模型(表):

  • Category: 商品分类模型, 包含字段name(分类名称), slug(分类链接)
  • Product: 商品模型, 包含字段category(所属分类), name(商品名称), slug(商品链接), description(商品描述), price(商品价格), available(是否上架), created(创建时间), modified(修改时间)
  • Order: 订单模型, 包含字段username(客户姓名), mobile(客户电话), address(客户地址), city(客户城市), pay_status(是否支付), created(创建时间), modified(修改时间)
  • OrderItem: 订单条目(订单中每种商品一个条目), 包含字段order(所属订单), product(订购的商品), quantity(订购数量)

修改项目目录下的models.py, 创建我们需要的模型

from django.db import models

class Category(models.Model):
name = models.CharField("分类名称", max_length=200, db_index=True)
slug = models.SlugField("分类链接", max_length=200, db_index=True, unique=True) class Product(models.Model):
category = models.ForeignKey(Category, related_name='category', on_delete=models.CASCADE, verbose_name="所属分类")
name = models.CharField("商品名称", max_length=200, db_index=True)
slug = models.SlugField("商品链接", max_length=200, db_index=True)
description = models.TextField("商品描述", blank=True)
price = models.DecimalField("商品价格", max_digits=10, decimal_places=2)
available = models.BooleanField("是否上架", default=True)
created = models.DateTimeField("创建时间", auto_now_add=True)
updated = models.DateTimeField("更新时间", auto_now=True) class Order(models.Model):
username = models.CharField("客户姓名", max_length=50)
mobile = models.CharField("客户电话", max_length=25)
address = models.CharField("客户地址", max_length=250)
city = models.CharField("客户城市", max_length=100)
pay_status = models.BooleanField("是否支付", default=False)
created = models.DateTimeField("创建时间", auto_now_add=True)
updated = models.DateTimeField("更新时间", auto_now=True) class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='order_items', on_delete=models.CASCADE, verbose_name="所属订单")
product = models.ForeignKey(Product, related_name='product_items', on_delete=models.CASCADE, verbose_name="订购产品")
quantity = models.PositiveIntegerField("订购数量", default=1)

5. 生成数据库表并创建超级用户

在项目目录下打开命令行窗口, 使用以下命令创建models.py对应的表

python3 manage.py makemigrations
python3 manage.py migrate

使用以下命令创建超级用户

python3 manage.py createsuperuser

输入用户名/邮箱/密码(两遍)创建超级用户

6. 编写Restful Api

6.1 为每个数据模型建立对应的序列化器

每一个Model实际上都是一个Python类的对象, 对象一般只能存活于内存中,想要进行保存和传输(作为响应返回), 我们一般需要将对象转化为字符串, 这称之为序列化

由于每个Model对象的结构不同, 我们要为每个对象建立对应的序列化器(用于将该Model对象转为字符串)

在shop应用目录下新建文件夹api, 在api下新建serializers.py,用于存放所有Model的序列化器, 内容如下:

from rest_framework import serializers
from ..models import Category, Product, Order, OrderItem class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category # 要序列化的模型
fields = '__all__' # 要序列化的字段 class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__' class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = '__all__' class OrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'

默认情况下, 每个Model都可以采用同样的套路, 复制粘贴修改即可

6.2 为每个模型建立对应的Restful Api

在标准的Restful Api模式中, 每个Model建立两个接口:

  • List接口: GET返回列表/POST新建
  • Detail接口: GET返回详情/PUT修改/DELETE删除

    在shop/api/目录下新建views.py, 内容如下:
from rest_framework import generics
from .serializers import CategorySerializer, ProductSerializer, OrderSerializer, OrderItemSerializer
from ..models import Category, Product, Order, OrderItem class CategoryList(generics.ListCreateAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer class CategoryDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer class ProductList(generics.ListCreateAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer class ProductDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer class OrderList(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer class OrderItemList(generics.ListCreateAPIView):
queryset = OrderItem.objects.all()
serializer_class = OrderItemSerializer class OrderItemDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = OrderItem.objects.all()
serializer_class = OrderItemSerializer

套路同样一致, 复制粘贴修改即可

  • generics.ListCreateAPIView: 指该接口支持列表和新建
  • generics.RetrieveUpdateDestroyAPIView: 指该接口支持详情/更新/删除

generics还支持各种单独的方法, 详见generics源码(Pycharm中按住Ctrl点击generics)

6.3 为接口挂载接口地址

在shop/api/下新建urls.py, 用于存放本应用api的接口地址, 每个Model格式一样, 内容如下:

from django.urls import path
from . import views app_name = 'shop' # 指定命名空间 urlpatterns = [
path('categories/', views.CategoryList.as_view(), name='category_list'),
path('categories/<pk>/', views.CategoryDetail.as_view(), name='category_detail'),
path('products/', views.ProductList.as_view(), name='product_list'),
path('products/<pk>/', views.ProductDetail.as_view(), name='product_detail'),
path('orders/', views.OrderList.as_view(), name='order_list'),
path('orders/<pk>/', views.OrderDetail.as_view(), name='order_detail'),
path('order_items/', views.OrderItemList.as_view(), name='order_item_list'),
path('order_items/<pk>/', views.OrderItemDetail.as_view(), name='order_item_detail'),
]

将应用api的接口地址挂在到项目的总路由下

修改项目路径django_shop目录下的urls.py, 内容如下:

from django.contrib import admin
from django.urls import path, include # 在原有的基础上增加导入include urlpatterns = [
path('admin/', admin.site.urls),
path('api/shop/', include('shop.api.urls', namespace='shop')), # 增加该行
]

7. 运行项目及调试接口

在项目路径下打开命令窗口, 运行 python3 manage.py runserver启动开发服务器

打开网页访问: http://127.0.0.1:8000/api/shop/categories/

即可看到分类列表接口(其他列表接口同理修改url即可, 如.../api/shop/projects/)

当前尚无数据(非登录状态无权限修改数据)

访问: http://127.0.0.1:8000/admin/ 使用超级管理员登录,并重新回到接口页面, 可使用POST创建新数据, 如下图:



创建后重新刷新页面(分类列表接口)即可看到创建的数据

分类详情接口, 访问: http://127.0.0.1:8000/api/shop/categories/1/

注意, 列表和详情统一使用复数categories, 1为该分类的id

使用Postman测试Api

  1. 使用Postman测试所有接口都需要提供Basic Auth授权, 操作方法如下

  1. 使用POST新建数据(支持表单和JSON格式), 其他接口及操作方法同理

注: 本次搭建的是通用的增删改查接口, 一般还需要根据项目实际需要进行添加和修改

下一节带着大家从Models 10分钟快速定制一套Admin后台系统

PS: 虽然标题是10分钟搭建一套Restful Api接口, 但是实际写这篇文章从下午7点下班一致在办公室写到凌晨1:20(现在), 码字不易, 欢迎多多点赞/评论和赞赏, 如有什么其他想学的教程也可留言给我

Django从Models 10分钟建立一套RestfulApi的更多相关文章

  1. Django从Models 10分钟定制一个Admin后台

    目录 Django从Models 10分钟建立一套RestfulApi Django从Models 10分钟定制一个Admin后台 简介 Django自带一个Admin后台, 支持用户创建,权限配置和 ...

  2. 10分钟搭建一个小型网页(python django)(hello world!)

    10分钟搭建一个小型网页(python django)(hello world!) 1.安装django pip install django 安装成功后,在Scripts目录下存在django-ad ...

  3. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  4. Django 补充models操作,中间件, 缓存,信号,分页

    1.Model 一对多 补充 models如下: class UserType(models.Model): caption = models.CharField(max_length=16) cla ...

  5. Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库

    前言     在 .Net Core 2.2中 Microsoft.AspNetCore.App 默认内置了EntityFramework Core 包,所以在使用过程中,我们无需再从 NuGet 仓 ...

  6. Django之Models操作

    一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...

  7. Django之Models(一)

    Django之Models(一) 目录 数据库的配置 模型代码与参数解析 ORM对单表的增删改查 查询的补充 数据库配置 django默认支持sqlite,mysql, oracle,postgres ...

  8. Django之Models进阶操作(字段属性)

    字段属性详细介绍 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列, ...

  9. Django之Models与ORM操作

    一.models例子 from django.db import models class User(models.Model): """ 用户表 "" ...

随机推荐

  1. C库函数:scanf、fscanf、printf、fprintf、sprintf、 snprintf

    1. scanf 函数原型 int scanf(const char *format, ...);  功能:从标准输入 stdin 读取格式化输入. 2.fscanf 函数原型 int fscanf( ...

  2. MyBatis 示例-主键回填

    测试类:com.yjw.demo.PrimaryKeyTest 自增长列 数据库表的主键为自增长列,在写业务代码的时候,经常需要在表中新增一条数据后,能获得这条数据的主键 ID,MyBatis 提供了 ...

  3. Java多线程(九):生产者消费者模型

    生产者消费者模型 生产者:生产任务的个体: 消费者:消费任务的个体: 缓冲区:是生产者和消费者之间的媒介,对生产者和消费者解耦. 当 缓冲区元素为满,生产者无法生产,消费者继续消费: 缓冲区元素为空, ...

  4. poj 1224

    题意:有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭. 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转. 现在要你求出一个5 * 6的矩阵,1表示这个灯被点击过 ...

  5. 动态对象(dynamic)的用法

    说到正确用法,那么首先应该指出一个错误用法: 常有人会拿var这个关键字来和dynamic做比较.实际上,var和dynamic完全是两个概念,根本不应该放在一起做比较.var实际上是编译期抛给我们的 ...

  6. javascript字符串机油

    1.创建字符串和数组的方法 1.1创建字符串的方法 a.直接数量:var str=“: b.字符串对象创建:新字符串(“): 1.2创建阵列的方法 a.var.arr=要素…. b.var arr=n ...

  7. 使用openSSL构造一个支持https的nodejs服务器

    首先通过下面的链接下载openSSL https://slproweb.com/products/Win32OpenSSL.html 下载完毕后,执行openssl进入交互式界面: 使用命令生成pri ...

  8. 2.SpringMVC执行流程

    SpringMVC 执行流程: 执行流程简单分析: 1.浏览器提交请求到中央调度器 2.中央调度器直接将请求转给处理器映射器 3.处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行 ...

  9. phpstorm 习惯设置

    phpstorm 习惯设置 1. 字体:Source Code Pro 大小:14 链接: https://pan.baidu.com/s/1HLpbduBHFvbq1a10QV4uCg 提取码: y ...

  10. (备忘)Eclipse设置:背景与字体大小和xml文件中字体大小调整

    Eclipse中代码编辑背景颜色修改: 1.打开window / Preference,弹出Preference面板  2.展开General标签,选中Editors选项,展开.  3.选中 Text ...