昨日内容回顾

  • 三板斧
# 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不能创建数据库,所以必须提前把库创建完成

python与MySQL的区别_数据

python与MySQL的区别_User_02

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,那么,就需要指定了
'''

python与MySQL的区别_python与MySQL的区别_03

python与MySQL的区别_python与MySQL的区别_04

python与MySQL的区别_数据_05

python与MySQL的区别_html_06

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!')
"""

python与MySQL的区别_html_07

python与MySQL的区别_html_08

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),
]
"""

python与MySQL的区别_数据_09

python与MySQL的区别_数据_10

python与MySQL的区别_User_11

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)