Django学习day03随堂笔记
每日测验
"""
今日考题
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/' # 访问静态文件的令牌 # 静态文件配置 settings.py
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对象方法
# 登陆功能 # form表单action三个参数写法 request.method # 获取当前请求方式 全大写的字符串 request.GET # 获取url问好后面携带的参数
.get() 列表最后一个元素
.getlist() 拿整个列表
request.POST # 获取post请求提交过来的普通键值对(不包含文件)
.get() 列表最后一个元素
.getlist() 拿整个列表
"""
前期我们在朝django后端提交post请求的是时候要先去配置文件中注释一行代码
MIDDLEWARE = [
# csrf...
]
""" def index(request):
if request.method == 'POST':
return HttpResponse('post')
return HttpResponse('get')
pycharm链接数据库
# 找到pycharm database选项(三个地方查找) # 选取对应的数据库 下载对应的驱动
"""
明明链接上了数据库 但是看不到表无法操作
这个时候你只需要将刚刚创建的链接删除 重新链接一次即可
"""
django链接MySQL
# 1.配置文件中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day60',
'USER':'root',
'PASSWORD':'admin123',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
} # 2.init文件指定pymysql
import pymysql
pymysql.install_as_MySQLdb()
django orm(重要)
"""
orm不会帮你创建库 只能创建到表的层面
需要你自己提前创建好库
"""
# 对象关系映射
表 类
记录 对象
数据 对象属性/方法
"""
能够让一个不会sql语句的python程序员也能够简单快捷的操作数据库,极大的提升开发效率
""" # 去应用下的models.py中书写模型类
# 类 模型类
# 表 模型表
class UserInfo(models.Model):
# 当你没有创建主键字段的时候orm会自动帮你创建一个名为id的主键字段
uid = models.AutoField(primary_key=True)
# uid int primary key auto_increment
username = models.CharField(max_length=32)
# username varchar(32) CharField字段一定要书写max_length参数
password = models.IntegerField()
# password int
**************************数据库迁移命令*****************************
1.python3 manage.py makemigrations
# 将操作记录到小本本上(migrations文件夹内) 不能真正的直接操作数据库
2.python3 manage.py migrate
# 将操作真正的同步到数据库中
"""只要在models中书写了跟数据库相关的代码 就必须要重新执行上述两条命令""" # pycharm简单快捷输入
tools
run manage.py task
自动提示
*******************************************************************
简单的orm语句
# 字段的增删改查
# 增
1.终端里面自己加默认值
2.null=True
3.default='666' # 删
注释代码执行两条命令 (然后收拾行李跑路走人)
# 在操作models.py中的代码的时候一定要细心 # 改
修改代码执行两条命令 # 数据的增查
# 增
from app01 import models
1.create()
user_obj = models.UserInfo.objects.create(**kwargs)
# 改方法有一个返回值 就是当前创建的数据对象本身
2.对象.save()
# 先生成一个类对象
user_obj = models.User(**kwargs)
# 对象调用save方法
user_obj.save() # 查
1.filter() # where
res = models.UserInfo.objects.filter(**kwargs)
"""
返回的结果是一个querySet对象 你可以把它看成是一个列表套数据对象
[数据对象1,数据对象2...] 支持索引和切片操作 但是不支持负数 并且不推荐你使用索引 .first()方法 filter括号内可以写多个参数 查询的时候默认是and关系
"""
今日内容概要
- 数据的查,改,删
- django orm中如何创建表关系
- django请求生命周期流程图(重要)
- 详细的讲django每一个部分的详细内容
- 路由层(urls.py)
- 虚拟环境
- django版本区别
数据的查,改,删
# 先讲数据库中的数据全部展示到前端 然后给每一个数据两个按钮 一个编辑一个删除
# 查看
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())
# 编辑功能
# 点击编辑按钮朝后端发送编辑数据的请求
"""
如何告诉后端用户想要编辑哪条数据?
将编辑按钮所在的那一行数据的主键值发送给后端
利用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):
# 获取url问号后面的参数
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')
# 去数据库中修改对应的数据内容
# 修改数据方式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()
"""
上述方法当字段特别多的时候效率会非常的低
从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
"""
# 跳转到数据的展示页面
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
# Create your models here.
#创建表关系 先将基表创建出来 然后再添加外键字段
#书表
class Book(models.Model):
title = models.CharField(max_length=32,verbose_name="书籍名称")
price = models.DecimalField(max_digits=8,decimal_places=2,verbose_name="书籍价格")
# 总共八位 小数点后面占两位
"""
图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
"""
publish = models.ForeignKey(to='Publish',on_delete=models.DO_NOTHING)#默认就是与出版社表的关键字段做外键关联
"""
django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:
TypeError: init() missing 1 required positional argument: ‘on_delete’
注:由于多对多(ManyToManyField)没有 on_delete 参数,所以以上只针对外键(ForeignKey)和一对一(OneToOneField)
on_delete=None, 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, 删除关联数据,什么也不做
"""
"""
如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
如果你自作聪明的加了_id那么orm还是会在后面继续加_id
后面在定义ForeignKey的时候就不要自己加_id
"""
"""
图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
在mysql中需要自己单独再建立一个表 但是在orm中 只需要告诉orm谁和谁是多对多的关系 然后它自动会创建
"""
authors = models.ManyToManyField(to='Author')
"""
authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
让orm自动帮你创建第三张关系表
"""
#出版社表
class Publish(models.Model):
name = models.CharField(max_length=32,verbose_name="出版社名称")
addr = models.CharField(max_length=32,verbose_name="出版社地址")
#作者表
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者名称")
age = models.IntegerField(verbose_name="作者年龄")
#作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.DO_NOTHING)
"""
OneToOneField也会自动给字段加_id后缀
所以你也不要自作聪明的自己加_id
"""
#作者详情表
class AuthorDetail(models.Model):
phone = models.BigIntegerField(verbose_name="作者手机号") #或者直接字符类型
addr = models.CharField(max_length=32, verbose_name="作者地址")
"""
orm中如何定义三种关系
publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail')
ForeignKey
OneToOneField
会自动在字段后面加_id后缀
"""
# 在django1.X版本中外键默认都是级联更新删除的
# 多对多的表关系可以有好几种创建方式 这里暂且先介绍一种
# 针对外键字段里面的其他参数 暂时不要考虑 如果感兴趣自己可以百度试试看
django请求生命周期流程图(必会)
# 每个人都要会画 这个图是你们后期复习django最好的一个梳理方式
# 扩展知识点
"""
缓存数据库
提前已经将你想要的数据准备好了 你来直接拿就可以
提高效率和响应时间
当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的
而是需要经过一段时间才会修改
博客园
了解即可
"""
路由层
路由匹配
# 路由匹配
url(r'test',views.test),
url(r'testadd',views.testadd)
"""
url方法第一个参数是正则表达式
只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
直接执行对应的视图函数
你在输入url的时候会默认加斜杠
django内部帮你做到重定向
一次匹配不行
url后面加斜杠再来一次
"""
# 取消自动加斜杠(在setting中设置)
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),
]
现在django3换成了path访问路由路径
urlpatterns = [
path('admin/', admin.site.urls),
#路由匹配
path('',views.index),#首页
path('test',views.test),
path('testadd',views.testadd),
]
无名分组
"""
分组:就是给某一段正则表达式用小括号扩起来
"""
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触发视图函数
# 先给路由与视图函数起一个别名
url(r'^func_kkk/',views.func,name='ooo')
# 反向解析
# 后端反向解析
from django.shortcuts import render,HttpResponse,redirect,reverse
reverse('ooo')
# 前端反向解析
<a href="{% url 'ooo' %}">111</a>
#django3 反向解析
# 先给路由与视图函数起一个别名
path('func',views.func,name='xxx')
# 前端反向解析
<a href="{% url 'xxx' %}">111</a>
# 后端反向解析
from django.shortcuts import render,HttpResponse,redirect,reverse
reverse('ooo')
作业
"""
必做题:
1.整理今日内容到博客
2.自己完成单表的增删改查功能(结合前端鼠标点点操作)
3.自己找几张表练习如何创建表与表之间的关系
选做题:
1.尝试着利用路由匹配和反向解析完成数据的编辑和删除功能
2.构思图书管理系统(后面会讲,自己先尝试着看看)
"""
Django学习day03随堂笔记的更多相关文章
- Django学习day13随堂笔记
每日测验 """ 今日考题 1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点 2.基于django中间件的 ...
- Django学习day02随堂笔记
每日测验 """ 今日考题 1.谈谈你对web框架的认识,简述web框架请求流程 2.python三大主流web框架的区别 3.安装django需要注意的事项有哪些(最少 ...
- Django学习day12随堂笔记
每日测验 """ 1.什么是cookie和session,你能描述一下它们的由来和工作机制吗(切勿糊弄,敷衍了事) 2.django中如何操作cookie和session ...
- Django学习day08随堂笔记
今日考题 """ 今日考题 1.聚合查询,分组查询的关键字各是什么,各有什么特点或者注意事项 2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他用法 3.列举常 ...
- Django学习day07随堂笔记
今日考题 """ 今日考题 1.必知必会N条都有哪些,每个都是干啥使的 2.简述神奇的双下划线查询都有哪些方法,作用是什么 3.针对多对多外键字段的增删改查方法有哪些,各 ...
- Django学习day05随堂笔记
每日测验 """ 今日考题 1.反向解析的本质是什么,无名和有名反向解析如何操作? 2..路由分发能够实现的前提是什么,需要注意什么,名称空间什么时候使用 3..什么是虚 ...
- Django学习day11随堂笔记
今日考题 """ 今日考题 1.简述自定义分页器的使用 2.forms组件是干什么用的,它的主要功能有哪些功能,你能否具体说说每个功能下都有哪些经常用到的方法及注意事项( ...
- Django学习day10随堂笔记
每日测验 """ 今日考题 1.默写ajax基本语法,及提交json数据和文件都需要添加哪些额外参数 2.什么是序列化,截止目前为止你所接触过的序列化有哪些 3.批量插入 ...
- Django学习day09随堂笔记
每日测验 """ 今日考题: 1.choices参数的应用场景有哪些,如何获取该字段的值 2.django是什么模型的框架,简述MTV与MVC模型 3.多对多表关系有几种 ...
随机推荐
- Java-SpringBoot注解方式实现AOP
AOP基本总结 连接点(JoinPoint): 连接点是程序运行的某个阶段点,如方法调用.异常抛出等 切入点(Pointcut): 切入点是JoinPoint的集合 是程序中需要注入Advice的位置 ...
- MongoDB-03-分片集群
分片集群(Sharding Cluster) 架构图 规划 10个实例:38017-38026 1 configserver:38018-38020 3台构成的复制集(1主两从,不支持arbiter) ...
- 【笔记】numpy.array基础(1)
numpy.array基础 使用numpy.__version__可以检查numpy的版本 当然也可以直接使用命令行检查numpy版本 也可以用来简化引用,使用as python list特点 num ...
- iNeuOS工业互网平台,在纸业领域的成功应用案例
目 录 1. 项目背景... 2 2. 项目基本情况... 3 3. 概念解释... 5 1. 项目背景 最终用户是全国第5大纸业集团之一,年浆纸产能40 ...
- noip20
T1 首先,这个插球,就是森林中连点,考虑dp,我们设 \(dp_{i,j}\) 表示有i个点的森林,有j个点在第一颗树中的概率,转移时考虑第i个点是否在第一颗子树里,转移方程: \[dp_{i,j} ...
- 面向对象之编写驱动程序--中断(linux系统、s3c6410开发板)
/*------------------------- *先申明下,本人是个菜鸟,刚开始接触驱动程序编写,交代下开发环境(主机系统redhat6.3,开发板ARM-s3c6410) 以watchdog ...
- C#窗体间互相传值
Demo窗体图片,Form1 Demo窗体图片,Form2 公共委托 using System; namespace _DeleFrm{ public class Dele { public ...
- viper配置管理
安装 go get github.com/spf13/viper viper支持的功能 1.可以设置默认值 2.可以加载多种格式的配置文件,如JSON,TOML,YAML,HCL和Java属性配置文件 ...
- vue 引用 tcplayer 做直播( 俩个例子,都可以用。替换直播地址即可,后端推流,前端观看。 )
例子一比例子二更加容易被理解.另外 m3u8 也支持 webrtc 开头的直播地址. 补充JS 得下载到本地,自行引入: https://imgcache.qq.com/open/qcloud/liv ...
- C#多线程开发-线程池03
你好,我是阿辉. 前面2篇文章介绍了线程的基础知识和线程同步,下面我们来一起认识学习下,线程池的使用. 线程池 创建线程是昂贵的操作,所以为每个短暂的异步操作创建线程会产生显著的开销.一般情况下,都会 ...