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

相关推荐
疯一样的码农4 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
Aniay_ivy2 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
gonghw4032 小时前
DearPyGui学习
python·gui
向阳12182 小时前
Bert快速入门
人工智能·python·自然语言处理·bert
engchina2 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
兆。2 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
南宫理的日知录2 小时前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
coberup3 小时前
django Forbidden (403)错误解决方法
python·django·403错误