Django框架入门四__构建数据库ORM模型与字段对应参数表,并操作数据库增删改查

Django ORM

  • Django 模型使用自带的 ORM
  • 对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换
  • ORM 在业务逻辑层和数据库层之间充当了桥梁的作用
  • ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中

使用 ORM 的好处:

  • 提高开发效率
  • 不同数据库可以平滑切换

使用 ORM 的缺点:

  • ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低
  • 长期写 ORM 代码,会降低编写 SQL 语句的能力

ORM 解析过程:

  1. ORM 会将 Python 代码转成为 SQL 语句
  2. SQL 语句通过 pymysql 传送到数据库服务端
  3. 在数据库中执行 SQL 语句并将结果返回

ORM 对应关系表:

在这里插入图片描述

1. 环境准备

目录结构
在这里插入图片描述
这里要先在命令行执行如下命令,不然服务启动会报错

 pip install mysqlclient 

在这里插入图片描述

修改 settings.py中的DataBase配置项,并修改如下内容

"""
如果你使用了 Python2.x 版本这里添加了中文注释
你需要在 /settings.py 文件头部添加
#  -*- coding: UTF-8 -*-
"""
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
        'NAME': 'test_django',  # 数据库名称
        'HOST': '127.0.0.1',  # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 3306,  # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'root',  # 数据库密码
    }
}

告诉 Django 使用 pymysql 模块连接 mysql 数据库

# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

找到代码文件根目录执行命令创建app

在这里插入图片描述

# linux环境下是 django-admin.py startapp app名称
django-admin startapp models

创建成功后目录结构如下

在这里插入图片描述

2. ORM模型的创建和映射

2.1 创建ORM模型

models/models.py 文件中创建ORM模型

from datetime import datetime
from django.db import models

# class Book 类名是数据库中的表名称
class Book(models.Model):
    """
    	 自动创建一个列名为id的且为自增的整数列
         字段名称 : name 代表数据库中表的字段 name
         字段类型 : CharField = varchar  DateTimeField=datetime FloatField=float
         max_length 限制最大长度
         null=False 不允许为空
    """
    name = models.CharField(max_length=20, null=False)
    author = models.CharField(max_length=20, null=False)
    pub_time = models.DateTimeField(default=datetime.now)
    price = models.FloatField(default=0)
2.1.1 常用字段类型及参数对应表
字段类型django对应参数参数描述
主键自增AutoFieldint自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列
bigint自增列BigAutoField必须填入参数 primary_key=True
整数IntegerField一个整数类型,范围在 -2147483648 ~ 2147483647
字符CharField字符类型,必须提供max_length参数, max_length表示字符长度
布尔值BooleanField布尔值类型,True,False
浮点型FloatField浮点类型的小数
精准浮点类型DecimalField10进制小数,支持更多位数的浮点类型计算
日期DateField日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例
日期时间DateTimeField格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
字符串类型EmailFieldDjango Admin以及ModelForm中提供验证机制
字符串类型IPAddressFieldDjango Admin以及ModelForm中提供验证 IPV4 机制
字符串类型URLFieldDjango Admin以及ModelForm中提供验证 URL
字符串类型SlugFieldDjango Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
字符串类型UUIDFieldDjango Admin以及ModelForm中提供对UUID格式的验证
字符串类型CommaSeparatedIntegerField格式必须为逗号分割的数字

字段参数表

字段参数描述
nullnull=False 代表该字段不允许为空
unique如果设置为unique=True 则该字段在此表中必须是唯一的
db_index如果db_index=True 则代表着为此字段设置数据库索引
default为该字段设置默认值,default = 字段默认值
auto_now_addDatetimeField、DateField、TimeField这个三个时间字段,配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库
auto_nowDatetimeField、DateField、TimeField这个三个时间字段,配置上auto_now=True,每次更新数据记录的时候会更新该字段
ForeignKeyForeignKey可以和其他表做关联关系同时也可以和自身做关联关系, 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多’中’多’的一方
to设置要关联的表
to_field设置要关联的表的字段
related_name反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’

2.2 添加app到配置文件中

myFirstDjango/settings.py文件中找到 INSTALLED_APPS配置,把app添加到配置中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'models'
]

2.3 创建映射关系

在项目根目录下执行以下命令
在这里插入图片描述
当然执行命令也可以使用 pycharm的命令行
在这里插入图片描述

创建表结构

python --version  // 查看python指向的版本
python manage.py migrate   // 创建表结构

执行结果
在这里插入图片描述
让 Django 知道我们在我们的模型有一些变更,生成迁移脚本文件

python manage.py makemigrations app名称

执行结果
在这里插入图片描述
将迁移脚本文件映射到数据库中

python manage.py migrate app名称

执行结果
在这里插入图片描述

查看数据库中是否有结果,表的命名方式为 app名称 _ class类名称,所以我这里为models_book

在这里插入图片描述

3. 总结准备环境和创建映射过程

1. pip install mysqlclient  # 下载mysqlclient 
2. 在settings.py中,配置好DATABASES,做好数据库相关的配置
3. 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
4. django-admin startapp app名称 # 创建app linux环境下使用django-admin.py
5. 在app中的models.py中定义好模型,这个模型必须继承自django.db.models
6. 将这个app添加到settings.py的INSTALLED_APP中
7. 在项目根目录执行如下三个命令 
python manage.py migrate  # 创建表结构
python manage.py makemigrations app名称 # 生成迁移脚本文件
python manage.py migrate app名称 #将迁移脚本文件映射到数据库中

4. 测试增删改查

目录结构
在这里插入图片描述

4.1 添加数据

myFirstDjango/创建文件 testdb.py,并添加如下内容

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""

# -*- coding: utf-8 -*-

from django.http import HttpResponse

from models.models import Book


# 数据库操作
def testdb(request):
    test1 = Book(name='西游记', author='吴承恩', price=19.88)
    test1.save()
    return HttpResponse("<p>数据添加成功!</p>")

myFirstDjango/urls.py中添加testdb的路由映射

from django.urls import path
from . import testdb

# 此项就是django的url配置
urlpatterns = [
    # 添加路由 testdb,并绑定视图为 testdb.testdb
    path('testdb', testdb.testdb)
]

启动服务,访问 http://localhost:8080/testdb,结果输出如下

在这里插入图片描述
查看数据库中是否有数据,有则表示成功

在这里插入图片描述

4.2 获取数据

修改 myFirstDjango/testdb.py 内容如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""

from django.http import HttpResponse

from models.models import Book


# 数据库操作
def testdb(request):
    # 初始化
    response = ""
    response1 = ""

    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    list = Book.objects.all()

    # filter相当于SQL中的WHERE,可设置条件过滤结果
    response2 = Book.objects.filter(id=1)

    # 获取单个对象
    response3 = Book.objects.get(id=1)

    # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    response4 = Book.objects.order_by('name')[0:2]

    # 数据排序
    response5 = Book.objects.order_by("id")

    # 上面的方法可以连锁使用
    response6 = Book.objects.filter(name="runoob").order_by("id")

    # 输出所有数据
    for var in list:
        response1 += var.name + " " + var.author + " " + str(var.price) + " " + str(var.pub_time)
    response = response1
    return HttpResponse("<p>" + response + "</p>")

启动服务,访问 http://localhost:8080/testdb,结果输出如下

在这里插入图片描述

4.3 更新数据

修改数据可以使用 save() 或 update():
修改 myFirstDjango/testdb.py 内容如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""
from django.http import HttpResponse
from models.models import Book


def testdb(request):
    # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    test1 = Book.objects.get(id=1)
    test1.name = '红楼梦'
    test1.save()

    # 另外一种方式
    # Book.objects.filter(id=1).update(name='水浒传')

    # 修改所有的列
    # Book.objects.all().update(name='三国演义')

    return HttpResponse("<p>修改数据成功</p>")

启动服务,访问 http://localhost:8080/testdb,结果输出如下

在这里插入图片描述
查看数据库中数据是否修改成功

在这里插入图片描述

4.4 删除数据

修改 myFirstDjango/testdb.py 内容如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""

from django.http import HttpResponse
from models.models import Book

# 数据库操作
def testdb(request):
    # 删除id=1的数据
    test1 = Book.objects.get(id=1)
    test1.delete()

    # 另外一种方式
    # Book.objects.filter(id=1).delete()

    # 删除所有数据
    # Book.objects.all().delete()

    return HttpResponse("<p>删除数据成功</p>")

启动服务,访问 http://localhost:8080/testdb,结果输出如下

在这里插入图片描述
查看数据库,删除成功!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我三胖哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值