django实现学生信息的增删改查

最近在学习django和rest_framework,做个对比然后简单记录下,本篇主要实现用原生django实现学生信息的增删改查。

1.项目和环境配置

安装django,执行命令:

python 复制代码
pip install django

在cmd控制台指定目录下或者pycharm的Terminal端执行命令创建项目,我是在pycharm中直接执行的,命令后带.表示在当前目录下创建项目,只生成1层drftest目录(因为我外层已经有一层drftest目录),如果需要两层可以将命令后的.去掉。

python 复制代码
django-admin startproject drftest .

创建app执行命令:

python 复制代码
django-admin startapp stu_django

在drftest项目下settings.py文件中注册新创建的app"stu_django"。

python 复制代码
INSTALLED_APPS = [
    'stu_django',
]

创建数据库&配置数据库

在本地手动创建或者用命令创建数据库drfstudy,在drftest项目settings.py文件中将db.sqlite3的配置信息注释,然后启用mysql相关配置,配置信息如下:

python 复制代码
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "drfstudy",
        "HOST": "127.0.0.1",
        "PORT": 3306,
        "USER": "root",
        "PASSWORD": "root",
    },
}

执行命令生成迁移文件和迁移数据到数据库:

python 复制代码
python manage.py makemigrations
python manage.py migrate

2.维护model

在stu_django项目下models.py文件中新增表Student的信息,代码如下:

python 复制代码
from django.db import models


# Create your models here.


class Student(models.Model):
    name = models.CharField(max_length=255, verbose_name="姓名")
    sex = models.BooleanField(default=True, verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄")
    classmate = models.CharField(db_column="class", max_length=5, verbose_name="班级编号")
    description = models.TextField(max_length=1000, null=True, blank=True, verbose_name="个性签名")

    class Meta:
        #表名
        db_table = "student"
        #后台站点名称
        verbose_name = "学生"
        verbose_name_plural = verbose_name
    
    #将对象内容以字典的形式返回
    def __str__(self):
        return str(self.__dict__)

3.编写视图

在app"stu_django"下的views.py文件中编写视图,包含学生的单个查询、所有查询,新建,修改、删除,分成2个类来实现,如下所示:

python 复制代码
from django.shortcuts import render

import json
from django.views import View
from django.http.response import JsonResponse
from .models import Student

# Create your views here.
"""
POST /students/   添加一个学生信息
GET  /students/   获取所有学生信息

GET /students/<pk>/  获取一个学生信息
PUT /students/<pk>/  更新一个学生信息
DELETE /students/<pk>/  删除一个学生信息

一个路由对应一个视图类,所以我们可以把5个API分成2个类来完成
"""


class StudentView(View):
    """学生视图"""

    def post(self, request):
        """添加一个学生信息"""
        # 1. 接收客户单提交的数据,验证客户端的数据
        data = json.loads(request.body)
        name = data.get("name")
        sex = data.get("sex")
        age = data.get("age")
        classmate = data.get("classmate")
        description = data.get("description")

        # 2. 操作数据库,保存数据
        instance = Student.objects.create(
            name=name,
            sex=sex,
            age=age,
            classmate=classmate,
            description=description,
        )

        # 3. 返回结果
        return JsonResponse(data={
            "id": instance.pk,
            "name": instance.name,
            "sex": instance.sex,
            "age": instance.age,
            "classmate": instance.classmate,
            "description": instance.description,
        }, status=201)

    def get(self, request):
        """获取多个学生信息"""
        # 1. 读取数据库
        students_list = list(Student.objects.values())

        # 2. 返回数据
        return JsonResponse(data=students_list, status=200, safe=False)


class StudentInfoView(View):
    def get(self, request, pk):
        """获取一条数据"""
        try:
            instance = Student.objects.get(pk=pk)
            return JsonResponse(data={
                "id": instance.pk,
                "name": instance.name,
                "sex": instance.sex,
                "age": instance.age,
                "classmate": instance.classmate,
                "description": instance.description,
            }, status=200)

        except Student.DoesNotExist:
            return JsonResponse(data=None, status=404)  # 没有内容

    def put(self, request, pk):
        """更新一个学生信息"""
        # 1. 接收客户单提交的数据,验证客户端的数据
        data = json.loads(request.body)
        name = data.get("name")  # alt+j 选中多个一样的
        sex = data.get("sex")
        age = data.get("age")
        classmate = data.get("classmate")
        description = data.get("description")

        # 2. 操作数据库,保存数据
        try:
            instance = Student.objects.get(pk=pk)
            instance.name = name
            instance.sex = sex
            instance.age = age
            instance.classmate = classmate
            instance.description = description
            
            //保存修改的信息
            instance.save()

        except Student.DoesNotExist:
            return JsonResponse(data={}, status=404)  # 没有内容

        # 3. 返回结果
        return JsonResponse(data={
            "id": instance.pk,
            "name": instance.name,
            "sex": instance.sex,
            "age": instance.age,
            "classmate": instance.classmate,
            "description": instance.description,
        }, status=201)

    def delete(self, request, pk):
        """删除一个学生信息"""
        try:
            Student.objects.filter(pk=pk).delete()
        except:
            pass
        return JsonResponse(data={}, status=204)

4.配置路由

在app"stu_django"下新建urls.py文件,维护子路由信息如下:

复制代码
from django.urls import path,re_path
from . import views
urlpatterns = [
    path("students/", views.StudentView.as_view()),
    re_path("^students/(?P<pk>\d+)/$", views.StudentInfoView.as_view()),
]

在项目drftest的urls.py文件中维护主路由信息如下:

python 复制代码
from django.urls import path,include

urlpatterns = [
    path('api/', include("stu_django.urls")),
]

5.验证接口

执行命令启动项目:

python 复制代码
python manage.py runserver

使用postman发送请求,接口正常响应,数据正常写入到数据库中。

请求的json数据如下:

python 复制代码
{
    "name": "xiaoming",
    "age": 18,
    "sex": true,
    "classmate": 301,
    "description": "hello"
}

6.将app显示到admin后台

在当前app"stu_django"下引入model并注册,如下所示:

python 复制代码
# Register your models here.

from django.contrib import admin
from .models import Student

#将模型注册到店铺后台
admin.site.register(Student)

登录后台需要创建超级用户,执行下面命令创建,设置邮箱密码(邮箱可不设置),如下图所示。

python 复制代码
python manage.py createsuperuser

执行命令启动项目,然后访问项目地址:http://127.0.0.1:8000/admin/,用创建的账号密码登录可以看到app已经可以在后台成功显示,如下图所示。

python 复制代码
 python manage.py runserver 

7.站点名称修改

在当前app下app.py文件中新增verbose_name配置,如下所示:

python 复制代码
class StuDjangoConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'stu_django'
    #以下是新增部分
    verbose_name = '学生管理'

下一篇会讲述如何用rest_framework快速实现上述功能。

相关推荐
蔗理苦3 小时前
2025-04-05 吴恩达机器学习5——逻辑回归(2):过拟合与正则化
人工智能·python·机器学习·逻辑回归
啥都鼓捣的小yao4 小时前
Python解决“数字插入”问题
python·算法
csdn_aspnet4 小时前
如何在 Linux 上安装 Python
linux·运维·python
jimin_callon4 小时前
VBA第三十八期 VBA自贡分把表格图表生成PPT
开发语言·python·powerpoint·编程·vba·deepseek
愚戏师5 小时前
软件工程(应试版)图形工具总结(二)
数据结构·c++·python·软件工程
NEET_LH5 小时前
金融数据分析(Python)个人学习笔记(6):安装相关软件
python·金融·数据分析
哈哈哈哈哈哈哈哈哈...........6 小时前
【java】在 Java 中,获取一个类的`Class`对象有多种方式
java·开发语言·python
@小白向前冲6 小时前
python 重要易忘 语言基础
开发语言·python
蹦蹦跳跳真可爱5896 小时前
Python----计算机视觉处理(Opencv:道路检测之车道线拟合)
开发语言·人工智能·python·opencv·计算机视觉
bookish_2010_prj6 小时前
Jupyter notebook定制字体
linux·python·jupyter