昨日内容回顾
- 三板斧
# HttpResponse 主要返回文本类型的数据 返回给浏览器
# render 渲染页面的:
render(request, 'index.html', {'a':1, 'b':2})
render(request, 'index.html', locals())
# redirct 重定向:
redirect('http://www.baidu.com')
redirect('/admin/')
- 静态文件配置
# 1.什么是静态文件配置
js css img lib
# 2.静态文件存储位置
一般放在 static文件夹内 需要手动创建
按照具体信息不同 可以再创建下一级目录
js
css
img
lib
# 3.需要在配置文件里配置:
STATIC = '/static/' # 令牌,
# 完成路径:/static/css/a.css
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), #
os.path.join(BASE_DIR, 'static1'),
]
# html文件内动态引入:
{% load static %} import static
<link href='{% static 'css/a.css'%}'>
{{ }}
- form表单
<form action='' method='post'> # 从默认get请求头 改为 post请求头
'''
1. 不写
2. 全写
3. 写后缀
'''
- request对象的几个方法
# 1. request.method => 获取请求方式的
# 2. request.POST # {}
request.POST.get('username') # 只取最后一个
request.POST.getlist('hobby') # 获取所有
# 3. request.GET
request.GET.get('username') # 只取最后一个
request.GET.getlist('hobby') # 获取所有
- Django连接MySQL
# 1. 在配置文件中配置:
'NAME':'db2'
'HOST':'127.0.0.1'
'PORT':3306
'USER':'root'
'PASSWORD':123
'CHARSET':'utf8'
# 在python3.6以下要修改django底层使用的mysql模块,mysqldb
需要修改为pymysql
# 在任意的__init__.py文件中,加入下两句话
# 如果未安装 先执行安装:pip3 install pymysql
import pymysql
pymysql.install_as_mysqldb()
今日内容概要
- ORM的概念以及如何创建表
- ORM对字段进行增删改查
- ORM对数据的增删改查
- 小练习
- ORM创建外键关系
内容详细
1. ORM的概念
# 1. 什么是ORM?
关系映射对象
# 不但在python中有,在其他语言中也有
# 2. 特点:
在操作数据库的时候,不用再写原生SQL语句
'''相对而言,执行效率低了'''
# 3. ORM书写的位置:
在app目录下的 models.py文件中
# 4. 如何使用?
类名 >>> 表名
对象 >>> 记录
属性 >>> 字段
# 5. 如何来创建表?
# 在models.py文件中写入:
"""
from django.db import models
# Create your models here.
# 创建一张表 必须继承models
class User(models.Model):
# 组合索引,联合索引
# id int primary key auto_increment # 写法一
id = models.AutoField(primary_key=True) # 写法二
# username, max_length必须写
username = models.CharField(max_length=32) # 等同varchar(32)
# password, orm支持自定义数据类型
password = models.CharField(max_length=32) # 等同varchar(32)
"""
# 6. 类写完之后,一定要执行数据库迁移命令,才能真正的创建出来数据表
在settings文件中先修改配置:
"""
### 注释掉下面一行内容:
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
### 将 TEMPLATES中 'DIRS'的value改为下面内容:
TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR, 'templates')]
### 将 DATABASES中 原有的default注释掉 重新写入下面内容:
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day03', # 库名可以先自行用navicat创建好
'HOST': '127.0.0.1',
'POST': 3306,
'USER': 'root',
'PASSWORD': '123',
'CHARSET': 'UTF8'
}
}
"""
在任一__init__文件中 需要加入下面两句话:
"""
import pymysql
pymysql.install_as_MySQLdb()
"""
在Terminal 窗口中 执行以下两行代码 完成创建表:
'''
python manage.py makemigrations
python manage.py migrate
'''
# 凡是跟数据相关的操作都要执行以上两句话
# 补充:ORM不能创建数据库,所以必须提前把库创建完成
2. 字段的增删改查
# 1.增加字段
在models.py文件中写入:
"""
# 增加一个字段
age = models.IntegerField()
# 之后要重新执行 数据相关的两句话:
python manage.py makemigrations
python manage.py migrate
如果遇到报错:没有默认值
可选填 0 1
"""
# 2.修改字段
在models.py文件中写入:
"""
先将 增加字段代码注释掉
# 修改一个字段
age1 = models.IntegerField()
# 之后要重新执行 数据相关的两句话:
python manage.py makemigrations
python manage.py migrate
"""
# 3.删除字段
在models.py文件中写入:
"""
直接将想要删除的字段代码注释掉
# 之后要重新执行 数据相关的两句话即可:
python manage.py makemigrations
python manage.py migrate
"""
'''
如果你的表有主键,并且主键名也叫id,那么可以省略不写,自动创建
如果你的主键名不叫id,那么,就需要指定了
'''
3. ORM数据的增删改查
# 1.增加数据
在models.py文件中:
"""
from django.db import models
# Create your models here.
# 创建一张表 必须继承models
class User(models.Model):
# 组合索引,联合索引
# id int primary key auto_increment # 写法一
id = models.AutoField(primary_key=True) # 写法二
# username, max_length必须写
username = models.CharField(max_length=32) # 等同varchar(32)
# password, orm支持自定义数据类型
password = models.CharField(max_length=32) # 等同varchar(32)
"""
在urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
]
"""
在views.py文件中:
"""
from django.shortcuts import render,HttpResponse
from app01 import models
# Create your views here.
def index(request):
# 增加数据
# SQL语句:insert into xx ()
# ORM语法:
# 第一种方式:
res = models.User.objects.create(username='ly', password='123') # 返回值是当前插入的数据对象
# 第二种方式
obj = models.User(username='ly111', password=123)
obj.save() # 这句话才是真正的操作数据
return HttpResponse('HELLO!')
"""
# 2.修改数据(先查询 后修改)
在views.py文件中:
"""
from django.shortcuts import render,HttpResponse
from app01 import models
# Create your views here.
def index(request):
# 修改数据
# SQL语句:update db1 set username = '', password = '' where id=1 and ...
# orm:
# 修改第一种方式:
models.User.objects.filter(id=1).update(username='Deity') # 写法一
# models.User.objects.filter(pk=1).update(username='Deity') # 写法二 当id为主键时 可以直接写PK 效果一样
'''返回值是影响的行数'''
# 修改第二种方式
# 先要查到
# 查询方式一
# res = models.User.objects.filter(pk=1).all()[0] # 写法一
res = models.User.objects.filter(pk=1).first() # 写法二
# 查询方式二
# filter里面的条件是and关系
# res = models.User.objects.filter(pk=1, username='aaaa11').first() # [0]
# res = models.User.objects.filter(username='aaaa').filter(password=123).all() # [0]
'''只要返回值是QuerySet对象,那么,就可以一直点queryset提供的方法'''
# 接着再改
res.username = 'aaaa'
res.save()
# print(res) # User object
# print(res.username) # Deity
# print(res.password) # 123
return HttpResponse('HELLO!')
"""
# 3.删除数据
在views.py文件中:
"""
# 删除数据
# SQL语句:delete from user where id = 1
# orm:
models.User.objects.filter(pk=1).delete()
return HttpResponse('HELLO!')
"""
4. 小练习 ORM首页展示
# 在views.py文件中:
"""
from django.shortcuts import render,HttpResponse
from app01 import models
# Create your views here.
def home(request):
user_list = models.User.objects.all() # 查询所有数据
return render(request, 'home.html', locals())
"""
# 在urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', views.home),
]
"""
# 新建HTML文件 home.html内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">列表展示页</h1>
<a href="" class="btn btn-success btn-lg">添加数据</a>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.username }}</td>
<td>{{ user.password }}</td>
<td>
<a href="" class="btn btn-primary">修改</a>
<a href="" class="btn btn-danger">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</body>
</html>
# 1.添加数据功能实现
# 在urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', views.home),
# 添加数据
url(r'^add/', views.add),
]
"""
# 在views.py文件中:
"""
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.
def home(request):
user_list = models.User.objects.all() # 查询所有数据
return render(request, 'home.html', locals())
# 添加数据
def add(request):
if request.method == 'POST': # 默认浏览器首次请求是 GET请求
username = request.POST.get('username')
password = request.POST.get('password')
# 验证参数
# 数据入库
models.User.objects.create(username=username, password=password)
return redirect('/home/')
return render(request, 'add.html')
"""
# 新建HTML文件 add.html内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">添加数据</h1>
<form action="" method="post">
<div class="form-group">
username:<input type="text" name="username" class="form-control">
</div>
<div class="form-group">
password:<input type="text" name="password" class="form-control">
</div>
<input type="submit" value="提交" class="btn btn-success btn-block">
</form>
</div>
</div>
</body>
</html>
# 在home.html文件中 对应 a标签加入内容:
<a href="/add/" class="btn btn-success btn-lg">添加数据</a>
# 2.修改数据功能实现
# 在home.html文件中 对应 a标签加入内容:
<a href="/add/" class="btn btn-success btn-lg">添加数据</a>
# 在views.py文件中:
"""
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.
def home(request):
user_list = models.User.objects.all() # 查询所有数据
return render(request, 'home.html', locals())
# 添加数据
def add(request):
if request.method == 'POST': # 默认浏览器首次请求是 GET请求
username = request.POST.get('username')
password = request.POST.get('password')
# 验证参数
# 数据入库
models.User.objects.create(username=username, password=password)
return redirect('/home/')
return render(request, 'add.html')
# 修改数据
def edit(request):
id = request.GET.get('id')
edit_obj = models.User.objects.filter(pk=id).first()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 数据入库
models.User.objects.filter(pk=id).update(username=username, password=password)
# 跳回信息展示页
return redirect('/home/')
return render(request, 'edit.html', locals())
"""
# 在urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', views.home),
# 添加数据
url(r'^add/', views.add),
# 修改数据
url(r'^edit/', views.edit),
]
"""
# 新建HTML文件 edit.html内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">修改数据</h1>
<form action="" method="post">
<div class="form-group">
username:<input type="text" name="username" class="form-control" value="{{ edit_obj.username }}">
</div>
<div class="form-group">
password:<input type="text" name="password" class="form-control" value="{{ edit_obj.password }}">
</div>
<input type="submit" value="提交" class="btn btn-success btn-block">
</form>
</div>
</div>
</body>
</html>
# 3.删除数据功能实现
# 在home.html文件中 对应 a标签加入内容:
<a href="/delete/?id={{ user.id }}" class="btn btn-danger">删除</a>
# 在views.py文件中:
"""
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.
def home(request):
user_list = models.User.objects.all() # 查询所有数据
return render(request, 'home.html', locals())
# 添加数据
def add(request):
if request.method == 'POST': # 默认浏览器首次请求是 GET请求
username = request.POST.get('username')
password = request.POST.get('password')
# 验证参数
# 数据入库
models.User.objects.create(username=username, password=password)
return redirect('/home/')
return render(request, 'add.html')
# 修改数据
def edit(request):
id = request.GET.get('id')
edit_obj = models.User.objects.filter(pk=id).first()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 数据入库
models.User.objects.filter(pk=id).update(username=username, password=password)
# 跳回信息展示页
return redirect('/home/')
return render(request, 'edit.html', locals())
# 删除数据
def delete(request):
id = request.GET.get('id')
models.User.objects.filter(pk=id).delete()
return redirect('/home/')
"""
# 在urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', views.home),
# 添加数据
url(r'^add/', views.add),
# 修改数据
url(r'^edit/', views.edit),
# 删除数据
url(r'^delete/', views.delete),
]
"""
5. ORM创建表关系
# MySQL是关系型数据库
# 表与表关系有三种:
一对一:
外键字段建在任何一方都可以,但是,推荐建在使用频率比较高的一张表
一对多:
外键字段建在多的一方
多对多:
外键字段不建在任何一张表,而是 建在第三张表中
# 以图书表 出版社表 作者表 作者详情表 为例
图书和出版社是一对多 图书是多 出版社是一
图书和作者是多对多的关系
作者和作者详情表是一对一
"""
不常用的数据我们称之为冷数据
常用的数据我们称之为热数据
"""
# models.py文件内容:
from django.db import models
# Create your models here.
# ORM创建表关系
# 1. 先创建这张表的基础字段
# 2. 再回头创建外键字段
# 图书表
class Book(models.Model):
title = models.CharField(max_length=32)
'''
float # 日常使用就足够了
double # 精度更高点
decimal(5, 2) # 第一位数表示存储位数共5位 第二位数代表最多保留小数点后两位
结论:三者的精确度不一样
float < double < decimal
'''
price = models.DecimalField(max_digits=8, decimal_places=2)
# publish_id = models.ForeignKey(to='Publish', to_field='id') # 写法一
publish_id = models.ForeignKey(to='Publish') # 写法二 如果关联的是id字段,那么可以省略不写
# 建立多对多外键字段
authors = models.ManyToManyField(to='Author')
'''
authors是一个虚拟字段,不会真正的在book表中创建出来这个字段
这个字段是关联第三张表的
'''
# 出版社表
class Publish(models.Model):
addr = models.CharField(max_length=32)
# 作者表
class Author(models.Model):
name = models.CharField(max_length=128)
# 建立一对一外键字段
author_detail = models.OneToOneField(to='AuthorDetail')
# 作者详情表
class AuthorDetail(models.Model):
phone = models.CharField(max_length=32)