每日测验
"""
今日考题
1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题
2.request对象的方法有哪些,分别是干什么用的,请具体阐述细节及注意事项
3.django自带的数据库是什么,如何换成其他数据库例如MySQL,如何配置更换
4.什么是django orm,如何使用django orm,数据库迁移命令如何书写
5.orm字段的增删改查与数据的增查如何实现
"""
昨日内容回顾
静态文件配置
"""
在浏览器窗口输入url之所以能够访问到对应的资源是因为后端提前开设了该资源的访问接口
我们习惯将html文件存放在templates文件夹下
我们习惯将静态文件存放在static文件夹下
静态文件
网站已经写好的 活着是第三方现成的代码 直接拷贝使用
css文件 js文件 img文件 第三方组件
static文件夹内还会创建几个文件夹
css
js
img
第三方
django不会自动帮你创建static文件夹需要你自己手动创建
"""
STATIC_URL
= '/static/'
STATICFILES_DIRS
= [
os
.path
.join
(BASE_DIR
,'static'),
os
.path
.join
(BASE_DIR
,'static1'),
os
.path
.join
(BASE_DIR
,'static2'),
]
"""
查找顺序就是从上往下依次查找,查找到一个就不会继续往下找了所以可能会出现替换的情况
"""
<link href
="/static/a.txt"></link
>
{% load static
%}
<link href
="{% static 'a.txt' %}"></link
>
request对象方法
request
.method
request
.GET
.get
() 列表最后一个元素
.getlist
() 拿整个列表
request
.POST
.get
() 列表最后一个元素
.getlist
() 拿整个列表
"""
前期我们在朝django后端提交post请求的是时候要先去配置文件中注释一行代码
MIDDLEWARE = [
# csrf...
]
"""
def index(request
):
if request
.method
== 'POST':
return HttpResponse
('post')
return HttpResponse
('get')
pycharm链接数据库
"""
明明链接上了数据库 但是看不到表无法操作
这个时候你只需要将刚刚创建的链接删除 重新链接一次即可
"""
django链接MySQL
DATABASES
= {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day60',
'USER':'root',
'PASSWORD':'admin123',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
}
import pymysql
pymysql
.install_as_MySQLdb
()
django orm(重要)
"""
orm不会帮你创建库 只能创建到表的层面
需要你自己提前创建好库
"""
表 类
字段 类属性
记录 对象
数据 对象属性
/方法
"""
能够让一个不会sql语句的python程序员也能够简单快捷的操作数据库,极大的提升开发效率
"""
class UserInfo(models
.Model
):
uid
= models
.AutoField
(primary_key
=True)
username
= models
.CharField
(max_length
=32)
password
= models
.IntegerField
()
**************************数据库迁移命令
*****************************
1.python3 manage
.py makemigrations
2.python3 manage
.py migrate
"""只要在models中书写了跟数据库相关的代码 就必须要重新执行上述两条命令"""
tools
run manage
.py task
自动提示
*******************************************************************
简单的orm语句
1.终端里面自己加默认值
2.null
=True
3.default
='666'
注释代码执行两条命令 (然后收拾行李跑路走人)
修改代码执行两条命令
from app01
import models
1.create
()
user_obj
= models
.UserInfo
.objects
.create
(**kwargs
)
2.对象
.save
()
user_obj
= models
.User
(**kwargs
)
user_obj
.save
()
1.filter()
res
= models
.UserInfo
.objects
.filter(**kwargs
)
"""
返回的结果是一个querySet对象 你可以把它看成是一个列表套数据对象
[数据对象1,数据对象2...]
支持索引和切片操作 但是不支持负数 并且不推荐你使用索引
.first()方法
filter括号内可以写多个参数 查询的时候默认是and关系
"""
今日内容概要
数据的查,改,删django orm中如何创建表关系django请求生命周期流程图(重要)详细的讲django每一个部分的详细内容
路由层(urls.py)虚拟环境django版本区别
数据的查,改,删
def userlist(request
):
user_queryset
= models
.User
.objects
.all()
return render
(request
,'userlist.html',locals())
"""
如何告诉后端用户想要编辑哪条数据?
将编辑按钮所在的那一行数据的主键值发送给后端
利用url问号后面携带参数的方式
{% 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="" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
"""
def edit_user(request
):
edit_id
= request
.GET
.get
('user_id')
edit_obj
= models
.User
.objects
.filter(id=edit_id
).first
()
if request
.method
== "POST":
username
= request
.POST
.get
('username')
password
= request
.POST
.get
('password')
"""
将filter查询出来的列表中所有的对象全部更新 批量更新操作
只修改被修改的字段
"""
edit_obj
.username
= username
edit_obj
.password
= password
edit_obj
.save
()
"""
上述方法当字段特别多的时候效率会非常的低
从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
"""
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/')
"""
username password is_delete
jason
123 0
egon
123 1
django orm中如何创建表关系
"""
表与表之间的关系
一对多
多对多
一对一
没有关系
判断表关系的方法:换位思考
"""
图书表
出版社表
作者表
作者详情表
"""
图书和出版社是一对多的关系 外键字段建在多的那一方 book
图书和作者是多对多的关系 需要创建第三张表来专门存储
作者与作者详情表是一对一
"""
from django
.db
import models
class Book(models
.Model
):
title
= models
.CharField
(max_length
=32)
price
= models
.DecimalField
(max_digits
=8,decimal_places
=2)
"""
图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
"""
publish
= models
.ForeignKey
(to
='Publish')
"""
如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
如果你自作聪明的加了_id那么orm还是会在后面继续加_id
后面在定义ForeignKey的时候就不要自己加_id
"""
"""
图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
"""
authors
= models
.ManyToManyField
(to
='Author')
"""
authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
让orm自动帮你创建第三张关系表
"""
class Publish(models
.Model
):
name
= models
.CharField
(max_length
=32)
addr
= models
.CharField
(max_length
=32)
class Author(models
.Model
):
name
= models
.CharField
(max_length
=32)
age
= models
.IntegerField
()
"""
作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
"""
author_detail
= models
.OneToOneField
(to
='AuthorDetail')
"""
OneToOneField也会自动给字段加_id后缀
所以你也不要自作聪明的自己加_id
"""
class AuthorDetail(models
.Model
):
phone
= models
.BigIntegerField
()
addr
= models
.CharField
(max_length
=32)
"""
orm中如何定义三种关系
publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail')
ForeignKey
OneToOneField
会自动在字段后面加_id后缀
"""
django请求生命周期流程图(必会)
"""
缓存数据库
提前已经将你想要的数据准备好了 你来直接拿就可以
提高效率和响应时间
当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的
而是需要经过一段时间才会修改
博客园
了解即可
"""
路由层
路由匹配
url
(r
'test',views
.test
),
url
(r
'testadd',views
.testadd
)
"""
url方法第一个参数是正则表达式
只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
直接执行对应的视图函数
你在输入url的时候会默认加斜杠
django内部帮你做到重定向
一次匹配不行
url后面加斜杠再来一次
"""
APPEND_SLASH
= False/True
urlpatterns
= [
url
(r
'^admin/', admin
.site
.urls
),
url
(r
'^$',views
.home
),
url
(r
'^test/$',views
.test
),
url
(r
'^testadd/$',views
.testadd
),
url
(r
'',views
.error
),
]
无名分组
"""
分组:就是给某一段正则表达式用小括号扩起来
"""
url
(r
'^test/(\d+)/',views
.test
)
def test(request
,xx
):
print(xx
)
return HttpResponse
('test')
有名分组
"""
可以给正则表达式起一个别名
"""
url
(r
'^testadd/(?P<year>\d+)',views
.testadd
)
def testadd(request
,year
):
print(year
)
return HttpResponse
('testadd')
无名有名是否可以混合使用
"""
嘻嘻 不能混用
但是同一个分组可以使用N多次
"""
url
(r
'^index/(\d+)/(\d+)/(\d+)/',views
.index
),
url
(r
'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views
.index
),
反向解析
url
(r
'^func_kkk/',views
.func
,name
='ooo')
from django
.shortcuts
import render
,HttpResponse
,redirect
,reverse
reverse
('ooo')
<a href
="{% url 'ooo' %}">111</a
>
作业
"""
必做题:
1.整理今日内容到博客
2.自己完成单表的增删改查功能(结合前端鼠标点点操作)
3.自己找几张表练习如何创建表与表之间的关系
选做题:
1.尝试着利用路由匹配和反向解析完成数据的编辑和删除功能
2.构思图书管理系统(后面会讲,自己先尝试着看看)
"""