Django第四日
一 django连接mysql
-
如果项目使用sqlite,不需要额外配置,直接操作即可
-
代码声明
django默认用的是mysqldb
模块链接MySQL
但是该模块的兼容性不好 需要手动改为用`pymysql链接你需要告诉django不要用默认的mysqldb还是用pymysql
在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以import pymysql pymysql.install_as_MySQLdb()
-
showmigrations
:查看哪些记录更改了,但是没有同步到数据库中 -
如果使用mysql,需要配置如下:
- 配置文件中配置:
settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day62', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD':'123' } }
-
需要在 app的__init__.py 中写,为了pymsql的替换,上面讲过
import pymysql
pymysql.install_as_MySQLdb()
-
后续操作完全一样,在models中建立类,写字段
-
视图函数中插入,查询
-
pycharm的–》tools—》run manage.py Task
- 配置文件中配置:
二 路由层之简单路由配置
-
路由参数
- 第一个参数是正则表达式
- 第二个参数是视图函数内存地址
- 第三个参数是个字典 {‘name’:lqz,‘age’:18},给视图函数传递默认值
- 第四个参数name,当前路由的别名,用作反向解析
url(r'^home2/', views.home,{'name':'lqz','age':19},name='home'),
-
访问根路径,触发视图函数执行(路由怎么配)
url(r'^$', admin.site.urls),
-
在路由中配置多个相同路由会怎么样?
只会执行第一个 -
如下路由会怎么样?永远不会匹配到第二个
url(r'^login', views.home),
url(r'^login2', views.home),
三 数据库迁移命令
python3 manage.py makemigrations
将操作记录记录到小本本上(migrations文件夹)
python3 manage.py migrate
将操作真正的同步到数据库中
只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令
class User(models.Model):
# id int primary_key auto_increment
id = models.AutoField(primary_key=True,verbose_name='主键')
# username varchar(32)
username = models.CharField(max_length=32,verbose_name='用户名')
"""
CharField必须要指定max_length参数 不指定会直接报错
verbose_name该参数是所有字段都有的 就是用来对字段的解释
"""
# password int
password = models.IntegerField(verbose_name='密码')
class Author(models.Model):
# 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
# 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段
# 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写
# username varchar(32)
username = models.CharField(max_length=32)
# password int
password = models.IntegerField()
四 给html传值的两种方式
在view.py
中
def ab_render(request):
# 视图函数必须要接受一个形参request
user_dict = {
'username':'jason','age':18}
# 第一种传值方式:更加的精确 节省资源
# return render(request,'01 ab_render.html',{'data':user_dict,'date':123})
# 第二种传值方式:当你要传的数据特别多的时候
"""locals会将所在的名称空间中所有的名字全部传递给html页面"""
return render(request,'01 ab_render.html',locals())
return redirect(url)
五 字段的增删改查
字段的增加
- 可以在终端内直接给出默认值
- 该字段可以为空
info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
- 直接给字段设置默认值
hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
字段的修改
直接修改代码然后执行数据库迁移的两条命令即可!
字段的删除
直接注释对应的字段然后执行数据库迁移的两条命令即可!
执行完毕之后字段对应的数据也都没有了
注意出错:
在操作models.py的时候一定要细心
千万不要注释一些字段
执行迁移命令之前最好先检查一下自己写的代码
顶级建议: 当你离开你的计算机之后一定要锁屏
六 数据的增删改查
查
方式1
data = models.User.objects.filter()
方式2
user_queryset = models.User.objects.all()
返回值是类似列表套数据对象的格式
- 它也支持索引取值 切片操作 但是不支持负数索引
- 它也不推荐你使用索引的方式取值
推荐取值方式:user_obj = models.User.objects.filter(username=username).first()
filter
括号内可以携带多个参数 参数与参数之间默认是and关系
你可以把filter
联想成where
记忆
增
第一种方法
from app01 import models
res = models.User.objects.create(username=username,password=password)
- 返回值就是当前被创建的对象本身
第二种方法
user_obj = models.User(username=username,password=password)
user_obj.save() # 保存数据
改
修改数据方式1
models.User.objects.filter(id=edit_id).update(username=username,password=password)
"""
将filter查询出来的列表中所有的对象全部更新 批量更新操作
只修改被修改的字段
"""
修改数据方式2,了解即可,不会用的
edit_obj.username = username
edit_obj.password= password
edit_obj.save()
"""
上述方法当字段特别多的时候效率会非常的低
从头到尾将数据的所有字段全部更新一遍 无论该字段是否被修改
"""
删
跟编辑功能逻辑类似
# 在数据库中找到对应的数据删除
models.User.objects.filter(id=delete_id).delete()
# 批量删除
- 然而真正的删除功能应该需要二次确认 我们这里先不做后面会讲
- 大部分公司的删除数据,内部其实并不是真正的删除,我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是将字段修改一个状态
username password is_delete
jason 123 0
egon 123 1
查改删综合案例
userlist.html
以列表形式循环打印用户信息,并且每列信息后有编辑
、删除
按钮
{% for user_obj in user_queryset %}
<tr>
<td>{
{ user_obj.id }}</td>
<td>{
{ user_obj.username }}</td>
<td>{
{ user_obj.password }}</td>
<td>
<a href="/edit_user/?user_id={
{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
<a href="/delete_user/?user_id={
{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
edit_user.html
编辑数据窗口
<form action="" method="post">
<p>username:<input type="text" name="username" class="form-control" value="{
{ edit_obj.username }}"></p>
<p>password:<input type="text" name="password" class="form-control" value="{
{ edit_obj.password }}"></p>
<input type="submit" class="btn btn-info btn-block" value="编辑">
</form>
视图函数:展示用户
def userlist(request):
# 查询出用户表里面所有的数据
# 方式1
# data = models.User.objects.filter()
# print(data)
# 方式2
user_queryset = models.User.objects.all()
# return render(request,'userlist.html',{'user_queryset':user_queryset})
return render(request,'userlist.html',locals())
视图函数:编辑功能
# 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑
def edit_user(request):
# 获取url问号后面的参数,也就是选择的id
edit_id = request.GET.get('user_id')
# 查询当前用户想要编辑的数据对象,通过id从orm找到用户对象
edit_obj = models.User.objects.filter(id=edit_id).first()
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
# 去数据库中修改对应的数据内容
models.User.objects.filter(id=edit_id).update(username=username,password=password)
# 跳转到数据的展示页面
return redirect('/userlist/')
# 将数据对象展示到页面上
return render(request,'edit_user.html',locals())
视图函数:删除功能
def delete_user(request):
# 获取用户想要删除的数据id值
delete_id = request.GET.get('user_id')
# 直接去数据库中找到对应的数据删除即可
models.User.objects.filter(id=delete_id).delete()
"""
批量删除
"""
# 跳转到展示页面
return redirect('/userlist/')