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

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

1.项目和环境配置

        安装django,执行命令:

pip install django

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

django-admin startproject drftest .

         创建app执行命令:

django-admin startapp stu_django

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

INSTALLED_APPS = [
    'stu_django',
]

 创建数据库&配置数据库

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

# 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 manage.py makemigrations
python manage.py migrate

 2.维护model

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

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个类来实现,如下所示:

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文件中维护主路由信息如下:

from django.urls import path,include

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

5.验证接口

        执行命令启动项目:

python manage.py runserver

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

        请求的json数据如下:

{
    "name": "xiaoming",
    "age": 18,
    "sex": true,
    "classmate": 301,
    "description": "hello"
}

6.将app显示到admin后台

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

# Register your models here.

from django.contrib import admin
from .models import Student

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

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

python manage.py createsuperuser

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

 python manage.py runserver 

 

 7.站点名称修改

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

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

 

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

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值