最近在学习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快速实现上述功能。