• Django之ORM操作初了解


    文章开篇,我们首先复习下Django架构中的MTV模式,分别以字母来翻译就是:

    • Views-代码的核心逻辑
    • Tamplates-展示在页面上的html代码
    • Models-对数据库的操作

    那么Models中最为核心的便是本篇所介绍的ORM。

    一)基本知识

    ORM,关系对象映射,这是对它的本质进行翻译。那么我看来,ORM(Object Relational Mapping)是一种思想,它将对象和关系型数据库之间建立了映射关系。尽管使用ORM框架需要一些额外的开销,但经过恰当调优的ORM和手写原生的数据访问代码在性能上仍然有可比性。有些开发者可能因为以往的性能不佳的经验而拒绝采用ORM技术。不过,使用现代的ORM框架和合适的优化技巧,可以减少性能问题,并提高开发效率。
    image.png
    总结来看,ORM的开发效率高,执行效率低。

    1.基本操作
    a.操作步骤简介

    那么在Django框架中我们想使用,四步:

    1. 在我们根目录中的setting.py中可以看见如下代码以连接数据库:image.png
    2. 在根目录中的setting.py中注册app:

    image.png

    1. 编写models.类
    INSTALLED_APP = [
    	...
    	"app01.apps.App01Config"
    ]
    
    • 1
    • 2
    • 3
    • 4
    1. 执行命令

    这一步分为两小步也就是两个命令

    python manage.py makemigrations   
    # 找到所有已注册的app中的models.py中的类读取 -> migrations配置
    
    python manage.py migrate          
    # 读取已注册的app下的migrations配置 -> SQL语句  -> 同步数据库
    
    • 1
    • 2
    • 3
    • 4
    • 5
    b.连接数据库

    市面上的数据库有几种,那么相对应的连接的方式也大有不同,我们先看默认Django在根目录setting.py文件中的默认方法:
    image.png
    可以很明显的看见sqlite3这个名称,所以,它告诉Django使用SQLite数据库作为默认的数据库引擎,并指定数据库文件的路径为BASE_DIR / ‘db.sqlite3’。BASE_DIR是Django项目的根目录。
    sqlite3是Django框架所默认的数据库,关系型的文件数据库。在Django里面需要区分我们不同应用下的表数据,那么就会默认的在表名前面加上应用的名字:
    image.png
    那么Mysql的连接方式也与其大致相同:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxxxxxxx',  # 数据库名字
            'USER': 'root',
            'PASSWORD': 'root123',
            'HOST': '127.0.0.1',  # ip
            'PORT': 3306,
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当然,这里我也举例有psycopg2和oracle:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'mydatabase',
            'USER': 'mydatabaseuser',
            'PASSWORD': 'mypassword',
            'HOST': '127.0.0.1',
            'PORT': 5432,
        }
    }
    
    # 需要 pip install psycopg2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    DATABASES = {
    	'default': {
            'ENGINE': 'django.db.backends.oracle',
            'NAME': "xxxx",  # 库名
            "USER": "xxxxx",  # 用户名
            "PASSWORD": "xxxxx",  # 密码
            "HOST": "127.0.0.1",  # ip
            "PORT": 1521,  # 端口
        }
    }
    # 需要 pip install cx-Oracle
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    c.编写类

    在app中的models.py中按照规则编写类 ===> 表结构。每一个类就是一张表。
    使用Django的ORM操作来生成的表结构之后,尽量不能在数据库里面去对表进行设计操作,想要进行更改在Django项目里面进行修改,修改之后再执行。

    -@1-常见字段和参数

    那么在Django中的各种常见字段有哪些?参数有哪些?
    字段:

    CharField		# 字符串,是MySQL里面的varchar类型
    TextField		# 文本类型,等同于MySQL里面的text类型
    
    SmallIntegerField	# 小整型,和MySQL里面的smallint是等同的
    IntegerField		# 标准整型,和MySQL里面的int是等同的
    BigIntegerField		# 大整型,和MySQL里面的bigint是等同的
    PositiveIntegerField	# 无符号的标准整型,和MySQL里面的bigint无符号是等同的
    
    DateField		# 表示年月日
    DateTimeField	# 表示年月日时分秒
    
    BooleanField  	# 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1
    
    FloatField		# 浮点型,等同于MySQL里面的float类型
    DecimalField  	# 精确的小数,等同于MySQL里面的decimal类型
    #decimal和float的区别:
    #decimal:定点数据类型 表示小数   不存在精度误差 涉及到金额,使用定点型
    #float:浮点数据类型   表示小数   存在精度误差  涉及到金额都不使用浮点型
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    参数:

    verbose_name #表示备注信息,
    max_length  #表示字段的最大的长度
    null #表示在数据库里面是否可以为空
    blank #表示在页面展示上是否可以为空(admin)
    primary key #django里面已经定义好了使用id来作为主键,并且自增长
    unique #表示是否是一个唯一值 实际开发过程中(身份证号,手机号...)唯一索引
    default #默认值
    null #是否为空
    blank #页面上是否为空
    unique #唯一值
    db_index #添加索引
    choices # choices=((1, "男"), (2, "女"))存储到数据库的只能是 1和 2,在页面的展示的上男,女
    auto_now #是否写入当前时间
    max_digits #表示最多可以有多少位数
    decimal_places #表示小数点后保留几位
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    给大家举个例子:

    from django.db import models
    
    
    class UserInfo(models.Model):
        name = models.CharField(verbose_name="姓名", max_length=16, db_index=True,default=None)
        age = models.PositiveIntegerField(verbose_name="年龄",default=1)
        email = models.CharField(verbose_name="邮箱", max_length=128, unique=True,default=None)
        amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)
        register_date = models.DateField(verbose_name="注册时间", auto_now=True)
    
    
    class Goods(models.Model):
        title = models.CharField(verbose_name="标题", max_length=32)
        # detail = models.CharField(verbose_name="详细信息", max_length=255)
        detail = models.TextField(verbose_name="详细信息")
        price = models.PositiveIntegerField(verbose_name="价格")
        count = models.PositiveBigIntegerField(verbose_name="库存", default=0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    -@2-表关系

    关系型数据库:

    • 一解决记录实体的属性
    • 二解决记录实体与实体之间的关系

    任何开发使用数据库都离不开以下的关系:

    1. 单表关系(日志)
    2. 多表关系
    • 一对一:学生表(学号,姓名,性别)和学生的信息表(学号,爱好,家庭住址,紧急联系人…)
    • 一对多:公司员工表(工号,姓名,性别…),员工权限表(普通员工,主管,经理,董事长)一个员工既是整个公司里面的普通的员工,那么拥有公司普通员工的权限,又是销售部的小组长,那么就拥有销售部的组长的权限…
    • 多对多:男生表,女生表,相亲平台,一个男生在相亲平台上面可以约会多名女生;一个女生也可以在平台上约会多名男生

    特别注意:在开发一个小的项目的时候可以使用外键来进行数据的约束,这样可以减少业务逻辑的代码量;但是注意在开发一个大项目,或者你进入的是一个规范的大的公司,坚决不使用外键,因为外键会造成额外的性能消耗
    1.外键约束是可以增强数据完整性,但在做INSERT、UPDATE、DELETE时,数据库性能开销成倍增加。
    2.外键约束适用于中小应用系统。
    3.在大型应用系统中,一般不使用外键约束。而考虑其他方式来增强数据完整性。

  • 相关阅读:
    项目集管理PgMP:聚焦战略、收益与治理︱项目管理者联盟联合创始人宣晓锋
    【Java成王之路】EE初阶第二十二篇 博客系统(页面设计)
    神经网络 深度神经网络,深度神经网络的深度
    【操作系统——内存基本分段式存储管理】
    Python调用C++基于libcurl实现ftp上传客户端
    Stimulsoft Ultimate Reports 2022.3.1
    AVL树和2-3-4树详解
    PHP:BinarySearchTree二叉搜索树(附完整源码)
    基于鲲鹏服务器搭建简单的开源论坛系统(LAMP)实践分享
    FFplay文档解读-51-多媒体资源
  • 原文地址:https://blog.csdn.net/xiaoyu070321/article/details/133525997