• Django模型(一)


    目录

    一、简介

    二、ORM框架

    1.ORM的介绍

    2.ORM 的优点

    3.ORM 的缺点

    4.ORM 解析过程

    三、使用Django进行数据库开发的步骤

    1.定义模型类

    1) 数据库表名

    2) 关于主键

    3)属性命名限制

    4)字段类型

    5) 选项

    6) 外键

    7)示例

    2.配置

    3.模型迁移


    一、简介

    模型是有关数据的唯一确定的信息源。它包含要存储数据的基本字段和行为。通常,每个模型都映射到单个数据库表。

    • 每一个模型是django.db.models.Model的子类
    • 每一个模型属性代表数据表的一个字段。
    • Django提供了自动生成的数据库访问API,使用模型操作数据库很方便

    Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

    Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

    使用Django进行数据库开发的提示 :

    • MVT设计模式中的Model, 专门负责和数据库交互.对应(models.py)
    • 由于Model中内嵌了ORM框架, 所以不需要直接面向数据库编程.
    • 而是定义模型类, 通过模型类和对象完成数据库表的增删改查.
    • ORM框架就是把数据库表的行与相应的对象建立关联, 互相转换.使得数据库的操作面向对象.

    二、ORM框架

    1.ORM的介绍

    Django 模型使用自带的 ORM。

    对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

    在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

    ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

    2.ORM 的优点

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

    3.ORM 的缺点

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

    4.ORM 解析过程

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

    三、使用Django进行数据库开发的步骤

    1. 定义模型类
    2. 模型迁移
    3. 操作数据库

    1.定义模型类

    • 模型类被定义在"应用/models.py"文件中。
    • 模型类必须继承自Model类,位于包django.db.models中。

    Django根据属性的类型确定以下信息:

    • 当前选择的数据库支持字段的类型
    • 渲染管理表单时使用的默认html控件
    • 在管理站点最低限度的验证

    1) 数据库表名

    模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。

    可通过db_table指明数据库表名。

    2) 关于主键

    django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

    默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。

    pk是主键的别名,若主键名为id2,那么pk是id2的别名。

    3)属性命名限制

    • 不能是python的保留关键字。
    • 不允许使用连续的下划线,这是由django的查询方式决定的,在第4节会详细讲解查询。
    • 定义属性时需要指定字段类型,通过字段类型的参数指定选项。

           具体语法如下:

    属性=models.字段类型(选项)

    4)字段类型

    类型说明
    AutoField自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
    BooleanField布尔字段,值为True或False
    NullBooleanField支持Null、True、False三种值
    CharField字符串,参数max_length表示最大字符个数
    TextField大文本字段,一般超过4000个字符时使用
    IntegerField整数
    DecimalField十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
    FloatField浮点数
    DateField日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
    TimeField时间,参数同DateField
    DateTimeField日期时间,参数同DateField
    FileField上传文件字段
    ImageField继承于FileField,对上传的内容进行校验,确保是有效的图片

    5) 选项

    选项说明
    null如果为True,表示允许为空,默认值是False
    blank如果为True,则该字段允许为空白,默认值是False
    db_column字段的名称,如果未指定,则使用属性的名称
    db_index若值为True, 则在表中会为此字段创建索引,默认值是False
    default默认
    primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
    unique如果为True, 这个字段在表中必须有唯一值,默认值是False

    null是数据库范畴的概念,blank是表单验证范畴的

    6) 外键

    在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

    • CASCADE级联,删除主表数据时连通一起删除外键表中数据

    • PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据

    • SET_NULL设置为NULL,仅在该字段null=True允许为null时可用

    • SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用

    • SET()设置为特定值或者调用特定方法

    • DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常

    7)示例

    • 当前项目的开发, 都是数据驱动的。
    • 以下为书籍信息管理的数据关系:书名和人物是 :一对多关系

    • 要先分析出项目中所需要的数据, 然后设计数据库表.

    书籍信息表

    字段名字段类型字段说明
    idAutoField主键
    nameCharField书名
    idname
    1斗罗大陆
    2牧龙师

    人物信息表

    字段名字段类型字段说明
    idAutoField主键
    nameCharField人名
    genderBooleanField性别
    bookForeignKey外键
    idnamegenderbook
    1唐三False1
    2小舞True1
    3祝明朗False2
    4黎云姿True2

    定义模型类

    根据书籍表结构设计模型类:

    • 模型类:BookInfo
    • 书籍名称字段:name

    根据人物表结构设计模型类:

    • 模型类:PeopleInfo
    • 人物姓名字段:name
    • 人物性别字段:gender
    • 外键约束:book

    根据数据库表的设计

            在models.py中定义模型类,继承自models.Model

    1. from django.db import models
    2. # Create your models here.
    3. # 准备书籍列表信息的模型类
    4. class BookInfo(models.Model):
    5. # 创建字段,字段类型...
    6. name = models.CharField(max_length=10, verbose_name='名称')
    7. class Meta:
    8. db_table = 'bookinfo' # 指明数据库表名
    9. verbose_name = '图书' # 在admin站点中显示的名称
    10. def __str__(self):
    11. """定义每个数据对象的显示信息"""
    12. return self.name
    13. # 准备人物列表信息的模型类
    14. class PeopleInfo(models.Model):
    15. GENDER_CHOICES = (
    16. (0, 'male'),
    17. (1, 'female')
    18. )
    19. name = models.CharField(max_length=20, verbose_name='名称')
    20. gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    21. book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
    22. class Meta:
    23. db_table = 'peopleinfo'
    24. verbose_name = '人物信息'
    25. def __str__(self):
    26. return self.name

    2.配置

    在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库。

    使用MySQL数据库首先需要安装驱动程序

    pip install PyMySQL

    在Django的工程同名子目录的__init__.py文件中添加如下语句

    1. import pymysql
    2. pymysql.install_as_MySQLdb()

    作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。

    先在MySQL中创建数据库

    create database book charset=utf8;

    修改DATABASES配置信息

    1. DATABASES = {
    2. 'default': {
    3. 'ENGINE': 'django.db.backends.mysql',
    4. 'HOST': '127.0.0.1', # 数据库主机
    5. 'PORT': 3306, # 数据库端口
    6. 'USER': 'samual', # 数据库用户名
    7. 'PASSWORD': 'mysql', # 数据库用户密码
    8. 'NAME': 'bookmanger' # 数据库名字
    9. }
    10. }

    3.模型迁移

    迁移由两步完成 :

    1.生成迁移文件:根据模型类生成创建表的语句

    python manage.py makemigrations

    2. 执行迁移:根据第一步生成的语句在数据库中创建表

    python manage.py migrate

    在PyCharm中我们可以打开控制台下的【Terminal】来执行迁移命令:

    执行迁移文件前: 

     

    生成迁移文件后,【migrations】目录下会生成【0001_initial.py】文件:

     执行迁移:

    完成后,我们打开MySQL中在指定的数据库就能看到执行迁移成功的表:

  • 相关阅读:
    消费与储蓄的决定-中国视角下的宏观经济
    【深度学习】UniControl 一个统一的扩散模型用于可控的野外视觉生成
    sqlite3自动插入创建时间和更新时间
    Flask vs. Django:选择适合你的Web开发框架【第134篇—Flask vs. Django】
    uiautomator2常用命令
    升级iOS17后可以降级吗?iOS17退回iOS16方法教程分享
    小程序uView2.X框架upload组件上传方法总结+避坑
    Truenas scale 配置 TrueChart zerotier
    Redisson分布式锁实战
    STATA
  • 原文地址:https://blog.csdn.net/m0_61491995/article/details/126006846