Django框架实现RESTful API,对商品信息的增删改查,前后端分离

本文介绍了如何使用Django框架构建RESTfulAPI,包括创建项目、安装依赖、定义商品模型、迁移数据、创建序列化类、编写增删改查视图以及使用Postman测试接口。
摘要由CSDN通过智能技术生成

如果是第一次接触Django框架,可以先了解Django项目是怎么创建的。

1.什么是RESTful API?

RESTful API(Representational State Transfer API)是一种基于REST架构风格的应用程序接口。REST是一种设计风格,它通常用于构建分布式系统和网络应用程序。RESTful API设计的目标是使系统更加简单、可扩展、灵活,并具有良好的性能。
在这里插入图片描述

以下是RESTful API的一些关键特征:

  • 资源(Resources): 在REST中,数据和功能被视为资源,每个资源都有唯一的标识符(通常是URI)。
  • 表现层(Representation): 资源的状态以某种形式传输,可以是JSON、XML等格式。
  • 状态无关(Stateless): 每个请求从客户端包含所有信息,服务器不会存储关于客户端的任何信息。会话状态被完全存储在客户端。
  • 统一接口(Uniform Interface): 统一的方式与资源进行交互,包括资源标识符、资源的表现形式和基于标准方法的有限集合。
  • 无连接(Stateless):每个请求从客户端包含所有信息,服务器不会存储关于客户端的任何信息。会话状态被完全存储在客户端。

RESTful API可以通过HTTP协议进行通信,使用HTTP动词(GET、POST、PUT、DELETE等)来执行操作。这种设计风格的API在构建和维护上更为简单,易于理解和扩展,因此广泛应用于Web服务和移动应用程序的开发中。

1.1RESTful API 中的动作

  • GET(获取):用于从服务器获取资源或其属性的信息。
  • POST(创建): 用于在服务器上创建新的资源。客户端通常将数据包含在请求体中,然后服务器创建新资源。
  • PUT(更新): 用于更新服务器上的资源或创建新资源,如果资源已存在则进行更新,如果不存在则创建。
  • DELETE(删除): 用于从服务器上删除资源。

2.使用Django框架实现RESTful 接口

与常规的Django相比,要实现RESTful ,多了Serializer组件。这个组件的主要的作用是将Python数据类型转换为适合呈现的格式(例如JSON)的过程。

2.1初始化项目,安装必要的环境

使用pycharm创建好项目之后,安装所需要的包:Django Rest Framework
在pycharm中的Terminal输入

pip install djangorestframework

安装成功之后,修改settings.py 将framework 加入到当前已经有的配置中。


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # rest_frame_work
    'mall', #创建的app
]

如果是后端数据库使用的是Sql server 需要安装另外一个包

pip install mssql-django

修改settings.py中的DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': 'mall',  # 数据库名称
        'HOST': '127.0.0.1',  # 地址
        'PORT': '1433',  # 端口
        'USER': 'sa',  # 用户名
        'PASSWORD': '123456',  # 密码
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'MARS_Connection': True,
        },

    }
}

最后如果要使用ORM框架中的模型,必须创建app

python manage.py startapp mall

这里起名叫做mall,然后将mall 也加入settings.py的INSTALLED_APPS配置中。
最后的文件框架

至此项目初始化成功。最终的项目结构如下:
在这里插入图片描述

2.2定义商品模型

在models.py 加入商品模型

from django.db import models
class Product(models.Model):
    name = models.CharField(max_length=255, verbose_name="商品名称")
    description = models.TextField(blank=True, verbose_name="商品描述")
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品价格")
    stock = models.PositiveIntegerField(verbose_name="库存量")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
    def __str__(self):
        return self.name
    class Meta:
        verbose_name = "商品"
        verbose_name_plural = "商品信息"

2.3 迁移数据到数据库

python manage.py makemigrations mall# 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate mall

2.4 创建序列化类

在app文件中新建serializers.py文件,添加以下内容

from rest_framework import serializers

from mall.models import Product


class ProductSerializers(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

在这个示例中:

  • ProductSerializer 是一个序列化类,它继承自 serializers.ModelSerializer。
  • Meta 类定义了与序列化器相关的元数据。
  • model = Product 表示这个序列化器与 Product 模型关联。
  • fields = ‘all’ 表示序列化器应该包含模型中的所有字段。

2.5在视图创建商品增删改查的函数

from django.shortcuts import render
from django.http.response import JsonResponse
from rest_framework.parsers import JSONParser
from rest_framework import status
from mall.models import Product
from mall.serializers import ProductSerializers
from rest_framework.decorators import api_view
@api_view(['GET', 'POST', 'DELETE'])
def product_list(request):
    if request.method == 'GET':
        # 处理 GET 请求,获取所有产品列表
        products = Product.objects.all()
        product_serializer = ProductSerializers(products, many=True)
        return JsonResponse(product_serializer.data, safe=False)  # 返回产品列表的 JSON 数据

    elif request.method == 'POST':
        # 处理 POST 请求,创建新的产品
        product_data = JSONParser().parse(request)
        serializer = ProductSerializers(data=product_data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=status.HTTP_201_CREATED)
        return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        # 处理 DELETE 请求,删除所有产品
        count = Product.objects.all().delete()
        return JsonResponse({'message': '{} product were deleted successfully!'.format(count[0])},
                            status=status.HTTP_204_NO_CONTENT)

@api_view(['GET', 'PUT', 'DELETE'])
def product_detail(request, pk):
    try:
        # 尝试获取指定主键(pk)对应的产品
        product = Product.objects.get(pk=pk)
    except Product.DoesNotExist:
        return JsonResponse({'message': 'The Product does not exist'}, status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        # 处理 GET 请求,返回特定产品的详细信息
        serializer = ProductSerializers(product)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        # 处理 PUT 请求,更新特定产品的详细信息
        product_data = JSONParser().parse(request)
        serializer = ProductSerializers(product, data=product_data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        # 处理 DELETE 请求,删除特定产品
        product.delete()
        return JsonResponse({'message': 'Product was deleted successfully!'}, status=status.HTTP_204_NO_CONTENT)

2.6绑定url

与SPringBoot 不同,Django需要手动指定访问的url,具体步骤如下:
1.在app 文件中新建urls.py 文件 手动绑定url

from django.urls import re_path as url
from mall import views

urlpatterns = [
    url(r'^api/products$', views.product_list),
    url(r'^api/products/(?P<pk>[0-9]+)$', views.product_detail),
]

当输入xxxx/api/products 的时候,视图函数会判断是什么类型的动作,根据不同的HTTP动作来执行相应的逻辑。
2. 在项目中的urls.py 引入app的urls ,直接在项目urls.py也可以

from django.urls import re_path as url,include
urlpatterns = [
    url(r'^', include('mall.urls')),
]

3.使用Postman 测试接口

1.首先增加一条信息,使用Postman发送post请求,内容格式为Raw ,JSON
在这里插入图片描述
对应的JSON对象

 {
    "name": "Sample Product",
    "description": "This is a sample product description.",
    "price": 19.99,
    "stock": 100
}

发送请求之后,DJango返回201,代表创建成功。
在这里插入图片描述
2.请求地址不变,发送GET请求。
在这里插入图片描述
成功查询到数据。
3.测试id为2的商品数据,修改地址为 http://127.0.0.1:8000/api/products/2 与上述不同的是 多了数字,代表根据ID查询
在这里插入图片描述

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。 这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。 平时不明白的知识点,放在项目里去理解就恍然大悟了。   一、融汇贯通 本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用PythonDjango框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。   二、贴近实战 本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传、实现表格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格的批量化操作等等,所有的功能都通过演示完成、贴近了实战   三、课程亮点 在本案例中,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互   适合人群: 1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友; 2、有Django基础,但是想学习企业级项目实战的朋友; 3、有MySQL数据库基础的朋友  
好的,我可以提供一个简单的示例代码,以便您了解如何使用Django进行前后端分离增删改查操作。请注意,以下代码仅供参考,您需要根据自己的需求进行修改和完善。 首先,我们需要创建一个Django项目,并在其中创建一个应用程序。在应用程序中,我们需要定义模型以及处理HTTP请求的视图函数。 下面是一个简单的模型示例: ```python # models.py from django.db import models class Product(models.Model): name = models.CharField(max_length=100) description = models.TextField() price = models.DecimalField(max_digits=10, decimal_places=2) ``` 然后,我们需要创建视图函数来处理HTTP请求。在这个示例中,我们将创建一个基于类的视图,并使用Django Rest Framework提供的GenericAPIView和ModelMixin来实现CRUD操作。 ```python # views.py from rest_framework import generics, mixins from .models import Product from .serializers import ProductSerializer class ProductListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer 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 ProductRetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer 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) ``` 上述视图函数中,我们定义了两个基于类的视图:ProductListCreateAPIView和ProductRetrieveUpdateDestroyAPIView。ProductListCreateAPIView用于创建和列出产品,ProductRetrieveUpdateDestroyAPIView用于获取、更新和删除一个特定的产品。 接下来,我们需要定义序列化器来将模型转换为JSON格式。在这个示例中,我们使用Django Rest Framework提供的ModelSerializer。 ```python # serializers.py from rest_framework import serializers from .models import Product class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = '__all__' ``` 最后,我们需要在urls.py中定义路由,以便将HTTP请求路由到正确的视图函数。 ```python # urls.py from django.urls import path from .views import ProductListCreateAPIView, ProductRetrieveUpdateDestroyAPIView urlpatterns = [ path('products/', ProductListCreateAPIView.as_view(), name='product_list_create'), path('products/<int:pk>/', ProductRetrieveUpdateDestroyAPIView.as_view(), name='product_retrieve_update_destroy'), ] ``` 现在,我们已经完成了一个简单的Django前后端分离增删改查示例。您可以使用前端框架(如React或Vue.js)来处理HTTP请求并呈现数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trump. yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值