读万卷书,行万里路。——刘彝
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器©和视图(V)三层。
他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:
一般是用户通过浏览器向服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。
MySQL 是 Web 应用中最常用的数据库。
Django在model里面存储了数据的重要字段和行为,并且明确了信息来源,通常一个模型(model)映射到一个数据表。
**总结:**Django为用户提供了一个自动生成数据库访问的API
from django.db import models # Create your models here. class User(models.Model): ''' CharField 类型必须设置 max_length 参数 verbose_name 是对字段的注释,每个字段都有,且是第一个默认形参,所以可以直接在第一个位置 null = True 允许字段为空 default =0 设置默认值 ''' # id int primary key auto_increment;(sql语句效果与下面的ORM语句相同) id = models.AutoField(primary_key=True,verbose_name="主键ID") # name varchar(32); name = models.CharField(max_length=32,verbose_name='名字') # age int age = models.IntegerField(verbose_name="年龄") # pwd int pwd = models.IntegerField('密码',null=True) is_delete = models.IntegerField(default=0)
以下两条命令叫数据库迁移命令, 就比如上面我们创建了一个模型类, 于是我们就要进行这两条命令
1.生成数据库同步脚本,将数据库修改操作先记录下来(对应应用下的 migrations 文件夹) python3 manage.py makemigrations 2.真正的数据库迁移 python3 manage.py migrate
注意:只要动了models.py中跟数据库相关的代码就必须重新执行上述两条命令
在margrations 文件夹下生成的了一个文件
再来查看数据表已经生成了表.
class User1(models.Model): # 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段 # 如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段 # 如果你想让主键字段名不叫id 叫uid、sid、pid等则需要自己手动指定 username = models.CharField(max_length=32)
增:
# 增 1.可以直接终端内给出默认值 2.该字段可以为空 pwd = models.IntegerField('密码',null=True) # 该字段可以为空 3.直接给字段设置默认值 is_delete = models.IntegerField(default=0) # 默认值
改:
删(需谨慎):
查:
在操作models.py文件的时候一定要细心,千万别手抖,千万不要注释有段字段,在执行迁移命令之前最好检查一下自己的代码。
个人建议:当你离开你的计算机之后一定要锁屏,否则你离开的时候别人给你来个删库操作,你就要…
增加数据:
# 假设获取到用户传入的数据 username = "shawn" userpwd = 123 userage = 23 # insert into Student(name,age,pwd) values(username,userpwd,age); # 方式一 : user_obj.models.Student.objects.create(name=username,pwd=passwd,age=userage) # 方式二 : user_obj = models.Student(name=username,pwd=passwd,age=userage) user_obj.save()
查询数据:
# select * from Student where name=usernamr # 方式一 : user_obj = models.User.objects.filter(name=username)[0] # 方式二 : user_obj = models.User.objects.filter(name=username).first() # 推荐使用.first(). 但是其内部使用的也是通过索引取值
查询所有数据:
# select * from Student; # 方式一 : user_obj = models.User.objects.filter() # 方式二 : user_obj = models.User.objects.all() # [obj1,obj2,obj3]
修改数据:
# 方式一 : models.Student.objects.filter(id=edit_id).update(name=username,pwd=password) # 方式二 : edit_obj = models.Student.objects.filter(id=edit_id).first() edit_obj.name = username edit_obj.pwd = password edit_obj.save()
删除数据:
# 直接删除 models.Student.objects.filter(id=edit_id).delete() # 公司里删除数据并不会真正的删除, 而是在数据后面加一个字段来标志该数据有没有被删除 # 例如用 isdelete 字段来标识, 如果 isdelete=0 则未删除,如果 isdelete=1 则表示删除
from django.shortcuts import render,HttpResponse,redirect def login_func(request): from books import models # 导入数模型类文件 username = request.POST.get('username') # 获取用户输入的用户名 userpwd = request.POST.get('userpwd') # 获取用户输入的密码 if request.method == 'POST': # 拿到匹配的数据对象, 如果匹配不到则返回 None user_obj = models.Student.objects.filter(name=username,pwd=userpwd).first() if user_obj: print(user_obj.name,user_obj.pwd,user_obj.age,) # 可以打印信息查看一下 return HttpResponse(f'欢迎{user_obj.name}小可爱') return render(request,'login.html') # 匹配不到重新返回登入界面
from django.shortcuts import render,HttpResponse,redirect def register_func(request): from books import models username = request.POST.get('username') userpwd = request.POST.get('userpwd') userage = request.POST.get('userage') if request.method == 'POST': user_obj = models.Student.objects.filter(name=username).first() # 判断是否存在该用户 if not user_obj: user_obj = models.Student(name=username, pwd=userpwd, age=userage) user_obj.save() # 进行用户数据添加并保存 return HttpResponse(f'{user_obj.name}小可爱注册成功') return render(request, "register.html") # 如果用户存在,则重新返回注册界面
更多参考:菜鸟教程