视频加载失败

Django框架入门之ORM操作

2395 字
12 分钟
Django框架入门之ORM操作

【一】配置数据库#

【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)解决办法二:下载第三方模块#

  • 直接安装
Terminal window
pip install mysqlclient
  • 运气好不会报错,但是运气不好就会报错

(3)Win报错解决办法(下载whl文件)#

  • 下载对应的whl版本文件
  • 安装(切换到指定目录下执行 pip 安装命令)
Terminal window
pip install pip mysqlclient-2.2.4-cp310-cp310-win_amd64.whl

(4)Mac报错解决办法#

[1]步骤一:安装mysql-client#

Terminal window
brew install mysql-client

[2]步骤二:安装组件#

Terminal window
brew link --force --overwrite mysql-connector-c

[3]步骤三:修改mysql_config#

Terminal window
sudo vim /usr/local/mysql/bin/mysql_config
  • 替换内容
# 旧内容
# on macOS, on or about line 112:
# Create options
libs="-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 相关的库文件和头文件位置。
Terminal window
brew install pkg-config

[5]步骤六:安装mysqlclient#

Terminal window
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 任务里面
    • 一种是命令行
Terminal window
python manage.py makemigrations

(2)迁移记录生效#

  • 将操作同步到真正的数据库
Terminal window
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 makemigrations
python manage.py migrate

(3)数据库生效#

mysql -uroot -p
use user_data
desc 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字段

【补充】#

  • 每次修改关于数据库字段的操作时,都要执行数据库的迁移相关操作
Terminal window
python manage.py makemigrations
python 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="张三")
# 根据特定条件筛选数据(方式二)
# 查询包含"张"的所有name
filtered_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的记录年龄改为26
MyModel.objects.filter(age=25).update(age=26)
# 更新已有记录的值,可先通过查询获取对象实例后调用 .save() 方法
instance_to_update = MyModel.objects.get(name="张三")
instance_to_update.age = 26
instance_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】后端#

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录