Django从Models 10分钟建立一套RestfulApi

news/2024/11/25 13:50:26/

简介

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 modelsclass 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, OrderItemclass CategorySerializer(serializers.ModelSerializer):class Meta:model = Category   # 要序列化的模型fields = '__all__'   # 要序列化的字段class ProductSerializer(serializers.ModelSerializer):class Meta:model = Productfields = '__all__'class OrderSerializer(serializers.ModelSerializer):class Meta:model = Orderfields = '__all__'class OrderItemSerializer(serializers.ModelSerializer):class Meta:model = Categoryfields = '__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, OrderItemclass CategoryList(generics.ListCreateAPIView):queryset = Category.objects.all()serializer_class = CategorySerializerclass CategoryDetail(generics.RetrieveUpdateDestroyAPIView):queryset = Category.objects.all()serializer_class = CategorySerializerclass ProductList(generics.ListCreateAPIView):queryset = Product.objects.all()serializer_class = ProductSerializerclass ProductDetail(generics.RetrieveUpdateDestroyAPIView):queryset = Product.objects.all()serializer_class = ProductSerializerclass OrderList(generics.ListCreateAPIView):queryset = Order.objects.all()serializer_class = OrderSerializerclass OrderDetail(generics.RetrieveUpdateDestroyAPIView):queryset = Order.objects.all()serializer_class = OrderSerializerclass OrderItemList(generics.ListCreateAPIView):queryset = OrderItem.objects.all()serializer_class = OrderItemSerializerclass 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 viewsapp_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  # 在原有的基础上增加导入includeurlpatterns = [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接口, 如有什么其他想学的教程也可留言给我

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!


http://www.ppmy.cn/news/108619.html

相关文章

Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

ProtoBuf 语法(一)

系列文章 ProtoBuf 语法&#xff08;二&#xff09; ProtoBuf 语法&#xff08;三&#xff09; 文章目录 前言一、字段规则二、消息类型的定义与使用2.1 定义2.2 使用 三、enum 类型3.1 定义规则3.2 注意事项 四、any 类型4.1 类型说明4.2 类型使用 五、oneof 类型六、map 类型…

pod一直pendding,但是describe pod又看不到资源不足的信息

节点资源不足&#xff1a;检查集群中的节点资源使用情况&#xff0c;确保有足够的可用资源&#xff08;如CPU、内存和存储&#xff09;来调度Pod。您可以使用命令kubectl describe nodes查看节点的资源使用情况。 解决方法&#xff1a;如果节点资源不足&#xff0c;您可以考虑添…

day4,day5 -java集合框架

List、Set、Map等常用集合类的特点和用法。 常用集合类&#xff08;List、Set、Map 等&#xff09;是 Java 中提供的数据结构&#xff0c;用于存储和操作一组数据。以下是它们的特点和用法&#xff1a; List&#xff08;列表&#xff09;: 特点&#xff1a;有序集合&#xff0…

SAP-MM预制发票那些事

在物料发票校验的凭证预制中&#xff0c;您可以预制发票、贷项凭证和后续借记/贷记。这表示您可以在系统中输入数据并将其保存在凭证中&#xff0c;但是不进行过帐。 在“物料发票校验”中&#xff0c;您可以在以下情况中预制发票&#xff1a; 1、一位经验丰富的发票校验人员想…

软件测试的 20 个误区

软件测试中常遇到的 20 个误区&#xff0c;争取能给想从事软件测试的小伙伴一点启发。 1、测试人员不需要了解软件开发知识 抛开自动化测试&#xff0c;测试开发等&#xff0c;这些是必须要学习软件开发知识。功能测试和接口测试等还是需要软件开发知识的&#xff0c;例如新建…

Apache Kafka - 重识消费者

文章目录 概述Kafka消费者的工作原理Kafka消费者的配置Kafka消费者的实现高级API低级API 导图总结 概述 Kafka是一个分布式的消息队列系统&#xff0c;它的出现解决了传统消息队列系统的吞吐量瓶颈问题。 Kafka的高吞吐量、低延迟和可扩展性使得它成为了很多公司的首选消息队…

求个大数据开发的学习路线

随着数据开发工程师成为炙手可热的职位&#xff0c;与之相关各项条件水涨船高&#xff1a;录取标准、人才需求、以及&#xff0c;薪资待遇&#xff0c;因此想要学习大数据掌握相关技能才是自身最大的核心竞争力。 大数据工程师的技术要求如下&#xff1a; 1、掌握至少一种数据…