当前位置: 首页 > news >正文

Django 模型(Model)

1. 模型简介

ORM 简介

MVC 框架中一个重要的部分就是 ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。即直接面向对象操作数据,无需考虑 sql 语句

ORM 是“对象-关系-映射”的简称,主要任务是:

  • 根据对象的类型生成表结构。
  • 将对象(或对象列表)的操作,转换为 sql 语句。
  • 将 sql 查询到的结果转换为对象(或对象列表)。

这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。

Django 中的模型包含了存储数据的字段和约束,对应着数据库中唯一的表。

 

使用 Mysql 数据库的环境配置

创建数据库

create databases modeldemo charset=utf8

打开应用的 settings.py 文件,修改 DATABASES 项:

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'modeldemo',  # 使用的Mysql库名'USER': '用户名','PASSWORD': '密码','HOST': '数据库服务器ip,本地可以使用localhost','PORT': '端口,默认为3306',}
}

安装 python mysql API

python3
pip install pymysql 

且要在项目的 __init__.py 中添加:

import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)  # 指定版本。在出现“mysqlclient 1.4.0 or newer is required; you have 0.9.3.”报错时加上此行
pymysql.install_as_MySQLdb()

否则会出现报错:Error loading MySQLdb module: No module named 'MySQLdb'。

python2(已废弃,基本不用,可以不考虑)
pip install MySQL-python

且不需要在 __init__.py 中添加上述代码。

开发流程

  1. 在 models.py 中定义模型类,要求继承自 models.Model。
  2. 把应用加入 settings.py 文件的 installed_app 项。
  3. 迁移:生成迁移文件;执行迁移并生成表(迁移的目的是映射模型类与表。如果模型类与表的映射关系已存在,则无需迁移)。
  4. 使用模型类进行 crud(增删改查)操作。

 

2. 定义模型

在模型中定义属性,会生成表中的字段。

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

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

Django 会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则 Django 不会再生成默认的主键列。

属性命名限制:

  • 不能是 python 的保留关键字。
  • 由于 Django 的查询方式,不允许带有连续的下划线。

 

1)定义属性

定义属性时,需要明确字段类型。字段类型被定义在 django.db.models.fields 目录下,为了方便使用,被导入到了 django.db.models 中。

使用方式:

from django.db import models

通过 models.Field 创建字段类型的对象,赋值给属性。如:

title = models.CharField(max_length=20)

若想对重要数据都做逻辑删除而不做物理删除,实现方法是定义 isDelete 属性,类型为 BooleanField,默认值为 False。

 

2)字段类型

  • AutoField:一个根据实际 id 自动增长的 IntegerField,通常不指定。
    • 如果不指定,一个主键字段将自动添加到模型中。
  • BooleanField:true/false 字段,此字段的默认表单控制是 CheckboxInput。
  • NullBooleanField:支持 null、true、false 三种值。
  • CharField(max_length=最大字符长度):字符串,默认的表单样式是 TextInput。
  • TextField:大文本字段,一般超过 4000 字符时使用,默认的表单控件是 Textarea。
  • IntegerField:整数。
  • DecimalField(max_digits=None, decimal_places=None):使用 python 的 Decimal 实例表示的十进制浮点数。
    • DecimalField.max_digits:位数总数。
    • DecimalField.decimal_places:小数点后的数字位数。
  • FloatField:用 python 的 float 实例来表示的浮点数。
  • DateField[auto_now=False, auto_now_add=False]):使用 python 的 datetime.date 实例表示的日期。
    • 参数 DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为 false。
    • 参数 DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为 false。
    • 该字段默认对应的表单控件是一个 TextInput. 在管理员站点添加了一个 JavaScript 写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的 invalid_date 错误消息键。
    • auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果。
  • TimeField:使用 python 的 datetime.time 实例表示的时间,参数同 DateField。
  • DateTimeField:使用 python 的 datetime.datetime 实例表示的日期和时间,参数同 DateField。
  • FileField:一个上传文件的字段。
  • ImageField:继承了 FileField 的所有属性和方法,但对上传的对象进行校验,确保它是个有效的 image。

 

3)字段选项

通过字段选项,可以实现对字段的约束。实现方式是通过字段对象的关键字参数指定。

  • null:如果为 True,Django 将空值以 NULL 存储到数据库中,默认值是 False。
  • blank:如果为 True,则该字段允许为空白,默认值是 False。
    • 对比:null 是数据库范畴的概念,blank 是表单验证证范畴的。
  • db_column:字段的名
http://www.dtcms.com/a/274011.html

相关文章:

  • k8s服务发布进阶
  • k8s-高级调度(一)
  • k8s深度讲解:无限的扩展性 - CRD 与 Operator
  • Rust 变量遮蔽(Variable Shadowing)
  • Rust与UE5高效集成实战
  • 湖南群狼市场调查——专注汽车销售服务深度评测
  • 如何快速学习GO语言
  • ajax和XMLHttpRequest以及fetch
  • Rust基础-part2-变量和可变类型
  • C#中的设计模式:构建更加优雅的代码
  • 学弟让我帮忙写一个学生管理系统的后端,我直接上科技
  • 数据结构 之 【链式二叉树】(C语言实现二叉树的前序中序后序层序遍历,节点个数、树的高度、第K层的节点个数、查找、完全二叉树的判别、销毁创建二叉树)
  • 操作系统-进程
  • 加工进化论:SPL 一键加速日志转指标
  • 适配多场景,工业显示器让操作更高效
  • 2025最新版Docker讲解/面试/命令/容器化技术
  • 当信任上链解码区块链溯源系统开发逻辑与产业变革
  • 【第四节】ubuntu server安装docker
  • 专题:2025云计算与AI技术研究趋势报告|附200+份报告PDF、原数据表汇总下载
  • 探索飞算 JavaAI 进阶:解锁高效Java开发的新维度
  • VLM-R1 + GRPO 算法完整复现全过程日志
  • 在HTML中CSS三种使用方式
  • 飞算JavaAI:重塑Java开发的“人机协同“新模式
  • vue3+node.js+mysql写接口(二)
  • 优学教育实战03跟进管理
  • tensor
  • axios 与 fetch 的区别
  • C++前缀和与差分的深度探索
  • “SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用
  • K8s Service 终极解析:源码、性能、故障排查全攻略