Django框架入门之ORM操作
2395 字
12 分钟
Django框架入门之ORM操作
- 1纯手撸Web框架
- 2Python框架初识
- 3Django框架初识
- 4Django框架安装
- 5Django框架入门之小白必会三板斧
- 6Django便捷函数shortcuts
- 7Django框架入门之静态文件
- 8Django的静态文件
- 9Django框架入门之request对象
- 10Django框架入门之ORM操作本文
- 11Django框架之生命周期流程图
- 12Django框架之路由层
- 13Django框架之视图层
- 14Django框架之模板层
- 15Django框架之模型层
- 16图书管理系统
- 17Ajax基础操作
- 18Ajax进阶操作
- 19JS确认插件补充
- 20Django框架之序列化组件serializers
- 21Django框架之批量插入数据
- 22Django框架补充之分页器推导
- 23Django框架之Form组件
- 24Django框架Form组件之常用字段及插件
- 25Django框架Form组件之渲染HTML代码
- 26Django框架Form组件之渲染错误信息
- 27Django框架Form组件之钩子函数(Hook)
- 28Django框架Form组件之源码
- 29Django框架Form组件之模型表单ModelForm
- 30Django表单API详解
- 31Django框架之Cookie和Session
- 32Django框架之会话session补充
- 33Django框架之CBV添加装饰器的三种方式
- 34Django框架之中间件引入
- 35Django框架之中间件思想
- 36Django框架之csrf跨站请求
- 37Django框架之auth模块
- 38Django框架之settings源码
- 39Django框架之settings配置
- 40Django框架之settings核心配置项
- 41RBAC权限系统
- 42前端基础之URL编码
【一】配置数据库
【1】默认数据库
- 在 settings.py 文件中有一个配置项就是配置数据库的
- 但是Django默认的数据库是sqlite3数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', }}【2】指定数据库
- 修改 settings.py 中的数据库配置项
- 模版
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库名字 'NAME': "", # 数据库用户名 "USER": "", # 数据库密码 "PASSWORD": "", # 数据库 IP,本地默认是127.0.0.1/localhost "HOST": "localhost", # 数据库端口 "PORT": 3306, # 数据库编码 "CHARSET": "utf8mb4", }}- 示例
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库名字 'NAME': "user_data", # 数据库用户名 "USER": "root", # 数据库密码 "PASSWORD": "1314521", # 数据库 IP,本地默认是127.0.0.1/localhost "HOST": "127.0.0.1", # 数据库端口 "PORT": 3306, # 数据库编码 "CHARSET": "utf8mb4", }}【3】指定MySQL数据库报错
- django 默认使用mysqldb模块链接mysql
- 但是该模块的兼容性不好,需要手动修改为pymysql链接
(1)解决办法一:猴子补丁
- 在项目下的 init 或者任意的应用名下的 init 文件中书写一下代码
import pymysql
pymysql.install_as_MySQLdb()(2)解决办法二:下载第三方模块
- 直接安装
pip install mysqlclient- 运气好不会报错,但是运气不好就会报错
(3)Win报错解决办法(下载whl文件)

- 下载对应的whl版本文件
- 安装(切换到指定目录下执行 pip 安装命令)
pip install pip mysqlclient-2.2.4-cp310-cp310-win_amd64.whl(4)Mac报错解决办法
[1]步骤一:安装mysql-client
brew install mysql-client

[2]步骤二:安装组件
brew link --force --overwrite mysql-connector-c
[3]步骤三:修改mysql_config
sudo vim /usr/local/mysql/bin/mysql_config- 替换内容
# 旧内容# on macOS, on or about line 112:# Create optionslibs="-L$pkglibdir"libs="$libs -l "
# 新内容libs="-L$pkglibdir"libs="$libs -lmysqlclient -lssl -lcrypto"
[4]步骤四:安装编译工具
- 如果一直报错
Exception: Can not find valid pkg-config name.
- 因为 pkg-config 工具在系统路径中未找到。pkg-config 是一个用于查找软件包编译和链接所需配置信息的工具,特别是对于 C/C++ 库。
- 在构建 MySQLclient 库时,setuptools 需要通过 pkg-config 获取 mysqlclient 的编译器标志(CFLAGS)和链接器标志(LDFLAGS)。由于找不到 pkg-config,导致无法确识别和处理与 MySQL 相关的库文件和头文件位置。
brew install pkg-config[5]步骤六:安装mysqlclient
pip install mysqlclient
【二】连接数据库
【1】连接sqlite3数据库
【2】连接MySQL
【三】ORM介绍
【1】什么是ORM
- ORM是一种将对象与关系型数据库之间的映射的技术,主要实现了以下三个方面的功能:
- 数据库中的表映射为Python中的类
- 数据库中的字段映射为Python中的属性
- 数据库中的记录映射为Python中的实例
- ORM的主要优点是可以减少开发人员编写重复的SQL语句的时间和工作量,并且可以减少由于SQL语句的调整和更改所带来的错误。
【2】Django ORM的优点
- 与其他ORM框架相比,Django ORM拥有以下优点:
- 简单易用:Django ORM的API非常简单,易于掌握和使用。
- 丰富的API:Django ORM提供了丰富的API来完成常见的数据库操作,如增删改查等,同时也支持高级查询和聚合查询等操作。
- 具有良好的扩展性:Django ORM可以与其他第三方库进行无缝集成,如Django REST framework、Django-Oscar等。
- 自动映射:Django ORM支持自动映射,开发者只需要定义数据库表的结构,就可以自动生成相应的Python类,从而减少开发过程中的重复代码量。
【四】ORM操作之表操作
【1】定义模型表
- 在 models.py 文件中定义模型表
from django.db import models
# Create your models here.
# 定义模型类 类名默认即表名,但是后面可以自定义表名class User(models.Model): # 定义表字段,当前字段名为 username , 当前字段类型为字符串类型 , 当前字段约束为最多20个字符 username = models.CharField(max_length=20) # 定义表字段,当前字段名为 password , 当前字段类型为字符串类型 , 当前字段约束为最多20个字符 password = models.CharField(max_length=20)【2】数据库迁移
(1)生成迁移文件
- 将操作记录记录在migrations文件夹
- 虽然文件夹内有相关文件,但是此时并没有同步到数据库中,所以数据库是没有数据的
- manage.py 执行相关命令
- 方式有两种
- 一种是 task 任务里面
- 一种是命令行
python manage.py makemigrations(2)迁移记录生效
- 将操作同步到真正的数据库
python manage.py migrate(3)提醒
- 只要修改了models中有关数据库相关的代码,就必须执行上面的数据库迁移命令
【3】示例
(1)定义模型表
- 修改数据库操作时候,一定要进行数据库的重加载(我自己的叫法)
from django.db import models
# Create your models here.
class User(models.Model): # id int primary key auto_increment id = models.AutoField(primary_key=True)
# username varchar(32) username = models.CharField(max_length=32,verbose_name="用户名") # CharField : 必须指定 max_length 参数 ,不指定就会报错 # verbose_name : 该参数所有字段都可以使用,就是一个注释语法 # password int password = models.IntegerField()
class Author(models.Model): # 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段 # 所有当我们没有定义 主键 id字段 的时候,orm会帮我们创建一个名为 id 的主键字段 # 也就意味着后续我们在创建模型表的时候,如果主键字段名没有额外的叫法,那么主键字段可以省略不写
# username varchar(32) username = models.CharField(max_length=32)
# password int password = models.IntegerField()(2)迁移数据库
python manage.py makemigrationspython manage.py migrate
(3)数据库生效
mysql -uroot -p
use user_datadesc app01_user;+----------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || username | varchar(32) | NO | | NULL | || password | int(11) | NO | | NULL | |+----------+-------------+------+-----+---------+----------------+3 rows in set (0.00 sec)desc app01_author;+----------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+----------------+| id | bigint(20) | NO | PRI | NULL | auto_increment || username | varchar(32) | NO | | NULL | || password | int(11) | NO | | NULL | |+----------+-------------+------+-----+---------+----------------+3 rows in set (0.00 sec)
【五】ORM操作之字段操作
【1】字段属性
(1)允许为空
- 在定义模型类的相应字段时,可以为该字段添加 null=True 属性以允许其值为 None 或空字符串。
class MyModel(models.Model): name = models.CharField(max_length=50, null=True) # 允许name字段为空(2)指定默认值
- 设置字段的默认值可通过在字段定义时附加 default 参数实现。例如,给字段 age 设置默认值为 18
class MyModel(models.Model): age = models.IntegerField(default=18) # 默认年龄为18岁【2】字段增加
- 要在 Django 模型表中增加新的字段,只需在相应的 Model 类中添加新字段及其类型和所需属性。
from django.db import models
class MyModel(models.Model): name = models.CharField(max_length=50) created_at = models.DateTimeField(auto_now_add=True) # 新增一个自动记录创建时间的datetime字段 is_active = models.BooleanField(default=True) # 新增一个布尔类型字段,默认激活状态为True【3】字段删除
- 要从模型表中删除字段,请直接在 Model 类中注释掉该字段或者将其完全移除。
- 不过,在生产环境中删除字段前请确保不会影响现有数据,因为这可能导致数据丢失或结构不一致。
class MyModel(models.Model): name = models.CharField(max_length=50) created_at = models.DateTimeField(auto_now_add=True) is_active = models.BooleanField(default=True) # 移除is_removed字段【补充】
- 每次修改关于数据库字段的操作时,都要执行数据库的迁移相关操作
python manage.py makemigrationspython manage.py migrate【六】ORM操作之数据操作
【1】增加
(1)语法
模型表名.objects.create(字段名=字段值)(2)示例
new_instance = MyModel.objects.create( name="张三", age=25, email="zhangsan@example.com")【2】查询
(1)语法
- 获取到当前表中的全部数据
模型表名.objects.all()- 根据指定条件筛选数据
# 方式一模型表名.objects.get(筛选字段名=筛选字段值)
# 方式二模型表名.objects.filter(筛选字段名=筛选字段值)- 去除指定条件的数据
模型表名.objects.exclude(筛选字段名=筛选字段值)(2)示例
# 获取表中所有数据all_records = MyModel.objects.all()
# 根据特定条件筛选数据(方式一)filtered_records = MyModel.objects.get(name="张三")
# 根据特定条件筛选数据(方式二)# 查询包含"张"的所有namefiltered_records = MyModel.objects.filter(name__contains="张")
# 去除满足指定条件的数据# 过滤掉所有年龄小于18岁的记录excluded_records = MyModel.objects.exclude(age__lt=18)【3】更改
(1)语法
# 方式一:先查询直接修改模型表名.objects.filter(筛选字段名=筛选字段值).update(修改字段名=修改字段值)
# 方式二:先查询后修改obj = 模型表名.objects.get(筛选字段名=筛选字段值)obj.修改字段名=修改字段值obj.save()(2)示例
# 可以使用.filter() 和 .update() 方法批量更新符合条件的数据# 所有年龄为25的记录年龄改为26MyModel.objects.filter(age=25).update(age=26)
# 更新已有记录的值,可先通过查询获取对象实例后调用 .save() 方法instance_to_update = MyModel.objects.get(name="张三")instance_to_update.age = 26instance_to_update.save()【4】删除
(1)语法
# 方式一:删除需要先查询直接删除模型表名.objects.filter(筛选字段名=筛选字段值).delete()
# 方式二:删除需要先查询再删除instance_to_delete = MyModel.objects.get(筛选字段名=筛选字段值)instance_to_delete.delete()(2)示例
# 删除满足特定条件的记录,通常先通过查询获取对象实例再调用 .delete() 方法instance_to_delete = MyModel.objects.get(name="张三")instance_to_delete.delete()
# 可以使用 .filter() 方法批量删除MyModel.objects.filter(name="李四").delete() # 删除所有名字为"李四"的记录【示例】
【1】前端
【2】后端
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
C 语言发展史
编程语言了解 C 语言从 BCPL、B 语言到现代标准 C 的发展历程、核心特点与应用领域。
2
C 语言开发环境的安装与配置
编程语言在 Windows、Linux 与 macOS 上安装 C 工具链,配置编辑器,并编译运行第一个 C 程序。
3
C 语言初识:程序运行机制与基本结构
编程语言认识 C 程序从源代码到运行的完整流程,以及基础语法和程序的基本结构。
4
C 语言基础:注释、关键字、变量与数据类型
编程语言学习 C 语言的注释、关键字、标识符、常量、变量和基本数据类型等基础知识。
5
C 语言数据类型
编程语言理解 C 语言的数据类型体系,包括基本类型、整数类型、浮点类型和逻辑类型。
随机文章随机推荐














