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快速实现上述功能。

相关推荐
cwj&xyp7 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
是十一月末11 分钟前
Opencv实现图片的边界填充和阈值处理
人工智能·python·opencv·计算机视觉
算法小白(真小白)3 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
007php0073 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
Chinese Red Guest4 小时前
python
开发语言·python·pygame
骑个小蜗牛4 小时前
Python 标准库:string——字符串操作
python
黄公子学安全6 小时前
Java的基础概念(一)
java·开发语言·python
程序员一诺7 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python