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

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

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

image-20240209185757398

  • 下载对应的whl版本文件

  • 安装(切换到指定目录下执行 pip 安装命令)

pip install pip mysqlclient-2.2.4-cp310-cp310-win_amd64.whl

(4)Mac报错解决办法

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

brew install mysql-client 

image-20240209191439429

image-20240209191459685

[2]步骤二:安装组件

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

image-20240210110329746

[3]步骤三:修改mysql_config

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"

image-20240210111825222

[4]步骤四:安装编译工具

  • 如果一直报错
Exception: Can not find valid pkg-config name.

image-20240210112849630

  • 因为 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

image-20240210113026178

【二】连接数据库

【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 makemigrations
python manage.py migrate

image-20240210121104532

(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)

image-20240210121309820

【五】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 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】后端

posted @ 2024-02-27 08:24  Chimengmeng  阅读(60)  评论(0编辑  收藏  举报
/* */