Django ORM操作

【一】ORM操作

【1】配置数据库

(1)默认数据库

  • Django默认的数据库是sqlite3数据库
  • settings.py 文件中配置数据库如下
python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

(2)修改为MySQL

  • 最好是注释掉之前的,重新写
python 复制代码
DATABASES = {
    "default": {
        "ENGINE": 'django.db.backends.mysql',
        # 数据库名字
        "name": "pycharm_data",
        "USER": 'root',
        "PASSWORD": "000",
        "HOST": "localhost",
        "PORT": 3306,
        "CHARSET": 'utf8mb4',
    }
}
  • 此时运行启动项目将会报错

    • 需要添加猴子补丁

    • 在项目的__init__.py或者应用下的初始化py文件下添加都可以

    • 建议在项目的初始化文件下添加

    python 复制代码
    import pymysql
    pymysql.install_as_MySQLdb()

【2】ORM

(1)什么是ORM

  • ORM(对象关系映射)(Object Relational Mapping)是一种编程技术,用于在面向对象的程序和关系型数据库之间建立映射关系,将数据库表的数据映射为对象,以便于在程序中进行操作和处理。
    • 数据库中的 映射为Python中的
    • 数据库中的字段 映射为Python中的属性
    • 数据库中的记录 映射为Python中的对象或实例

(2)特点

  • 简化数据库操作:ORM隐藏了底层数据库的复杂性,开发人员可以使用面向对象的方式进行数据库操作,而无需编写复杂的SQL语句。
  • 提高开发效率:ORM提供了高级的抽象层,可以通过简单的代码实现数据库的增删改查操作,减少了开发人员的工作量和时间消耗。
  • 跨数据库平台:ORM框架通常支持多种数据库系统,开发人员可以使用相同的代码和API来操作不同的数据库,提高了应用的可移植性和扩展性。
  • 对象化数据操作:ORM将数据库表映射为对象,开发人员可以直接使用对象的属性和方法来操作数据,更加符合面向对象的编程思维。
  • 数据一致性和安全性:ORM框架通常提供了事务管理和数据验证等功能,确保数据的一致性和安全性,避免了手动处理事务和验证的繁琐工作。
  • 灵活的查询和关联操作:ORM提供了丰富的查询和关联操作,可以通过链式调用、过滤器、聚合函数等方式灵活地查询和操作数据。
  • 自动化的数据库表结构生成:ORM框架通常能够根据定义的对象模型自动生成数据库表结构,简化了数据库的设计和维护工作。

【3】ORM之表操作

(1)定义表

  • 创建一个用户表
    • 那么根据ORM的映射可知,我们要创建一个类
    • app01 --> models.py
python 复制代码
from django.db import models

# Create your models here.

class User(models.Model):
    
    # username varchar(20)
    username = models.CharField(max_length=20)
    # password varchar(20)
    password = models.CharField(max_length=20)

(2)Migrations

  • Migrations(迁移)是数据库迁移的具体实现方式,它是一组用于描述数据库结构变更的脚本或代码。
  • 每个迁移文件代表一个数据库版本的变更,包含了新增表、修改表结构、添加字段、删除字段等操作。
  • 在修改models文件后,一旦启动项目
    • 操作记录记录将保存在migrations文件夹
    • 但是此时并没有同步到数据库中,所以数据库是没有数据的
    • 所以需要进行数据库迁移
  • 只要修改了应用下的models那么就必须要进行数据库迁移

(2)数据库迁移

  • 生成数据库迁移文件
python 复制代码
python manage.py makemigrations
  • 数据库迁移
python 复制代码
python manage.py migrate
  • 在数据库中会创建很多的表
    • 除了我们创建的表,其他现在都不用管
    • 我们创建的表,表名添加了前缀
    • 是为了区分不同的所应用创建的

【4】ORM字段操作

  • 修改以后,记得进行数据迁移

(1)常用的字段类型

  • 整型IntegerField():
    • null=True:字段值可以为空,默认为False
    • default:修改默认值
  • Charfield()
    • max_length:这个参数必须写,字符串长度
  • DecimalField()
    • max_digits:最大位数包括小数
    • decimal_places:小数位数

(2)增

  • 在不写主键的情况下

    • 会自动创建主键,字段名为id

    python 复制代码
    id = AutoField(primary_key=True)
  • 如果原来没有数据

    • 可以正常修改,然后进行数据库迁移
  • 如果原来有数据

    • 那么需要指定指定默认字段是否可以为空。或者指定字段默认值,才可以进行字段新增

(3)删

  • 可以直接注释或者删除字段语句
  • 但是在数据迁移之前一定要确认好
  • 删除的字段,所有值将一起删除

【5】ORM数据操作

(1)增加

  • 语法一
    • 直接用类名创建
    • 然后执行save操作
python 复制代码
obj = MyModel(field1=value1, ...)
obj.save()
  • 语法二
    • 调用类的objects下的create方法
    • 不需要在save了
python 复制代码
MyModel.objects.create(field1=value1, ...)

(2)查询

  • 查询全部,语法:
    • 调用类的objcets下的all方法
python 复制代码
MyModel.objcets.all()
  • 筛选查询
    • 语法一
    • 调用类的objcets下的get方法
    • 多个参数之间是and的关系
    • 返回值为单个对象,不存在将会报错
python 复制代码
MyModel.objcets.get(field=value, ...)
  • 筛选查询
    • 语法二
    • 调用类的objcets下的filter方法
    • 多个参数之间是and的关系
    • 返回值为多个对象,不存在将返回(QuerySet)
python 复制代码
MyModel.objcets.filter(field=value, ...)
  • 去除指定条件的查询
    • 和fileter相反
python 复制代码
MyModel.objcets.exclude(field=value, ...)

(3)更改

  • 方式一
    • filter查询
    • update更改
    • 将修改所有满足条件的
    • 单个对象不支持update
python 复制代码
MyModel.objects.filter(filed=value,...).update(field=value, ...)
  • 方式二
    • get查询单个
    • .属性=新值
    • 最后save
python 复制代码
obj = MyModel.objects.get(field=value, ...)
obj.filed = value
obj.save()

(4)删除

  • 单个删除
    • 先get单个
    • 然后delete
python 复制代码
obj = MyModel.objects.get(field=value,...)
obj.delete()
  • 批量删除
    • 先filter得到查询集
    • 然后delete
python 复制代码
MyModel.objects.filter(field=value,...).delete()

(5)可以在应用的test.py文件里测试

python 复制代码
from django.test import TestCase

# Create your tests here.

import os

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
    import django

    django.setup()
    from 应用名 import models
    # 测试
    res = models.User.objects.all()
    print(res)
相关推荐
毕业设计制作和分享1 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil271 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk2 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境2 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n2 小时前
MYSQL库的操作
数据库·mysql
丕羽3 小时前
【Pytorch】基本语法
人工智能·pytorch·python
包饭厅咸鱼3 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库
bryant_meng3 小时前
【python】Distribution
开发语言·python·分布函数·常用分布
生命几十年3万天3 小时前
redis时间优化
数据库·redis·缓存
Elastic 中国社区官方博客3 小时前
释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作
大数据·数据库·人工智能·elasticsearch·搜索引擎·自然语言处理