Django的ORM操作

文章目录

    • 1.ORM操作
      • [1.1 表结构](#1.1 表结构)
        • [1.1.1 常见字段和参数](#1.1.1 常见字段和参数)
        • [1.1.2 表关系](#1.1.2 表关系)
      • 2.ORM
        • [2.1 基本操作](#2.1 基本操作)
        • [2.2 连接数据库](#2.2 连接数据库)
        • [2.3 基础增删改查](#2.3 基础增删改查)
          • [2.3.1 增加](#2.3.1 增加)
          • [2.3.2 查找](#2.3.2 查找)
          • [2.3.4 删除](#2.3.4 删除)
          • [2.3.4 修改](#2.3.4 修改)

1.ORM操作

orm,关系对象映射,本质翻译的。

1.1 表结构

实现:创建表、修改表、删除表。

在app中的models.py中按照规则编写类 ===> 表结构。

  • 编写类

    python 复制代码
    from django.db import models
    
    
    class UserInfo(models.Model):
        name = models.CharField(max_length=16)
        age = models.IntegerField()
  • 注册app

    python 复制代码
    INSTALLED_APPS = [
        # 'django.contrib.admin',
        # 'django.contrib.auth',
        # 'django.contrib.contenttypes',
        # 'django.contrib.sessions',
        # 'django.contrib.messages',
        'django.contrib.staticfiles',
        'apps.app01.apps.App01Config',
        'apps.app02.apps.App02Config',
    ]
  • 命令,django根据models中类生成一个 对数据库操作的配置文件 => migrations

    复制代码
    python manage.py makemigrations
  • 命令,读取已经注册么给app中的migrations目录将配置文件 -> 转换成:生成表,修改表 SQL -> 连接数据库去运行。

    python 复制代码
    python manage.py migrate
    • 那个数据库?

    • 数据库账户和密码?

      DATABASES = {
      'default': {
      'ENGINE': 'django.db.backends.sqlite3',
      'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
      }
      }

常见问题:请不要再手动去修改数据的表结构 + 时刻保证 ORM和数据表是对应。

1.1.1 常见字段和参数
  • 字段

    复制代码
    CharField
    
    SmallIntegerField
    IntegerField
    BigIntegerField
    
    DateField
    DateTimeField
    
    BooleanField  -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1
    
    DecimalField  -> 精确的小数
  • 参数

    python 复制代码
    name = models.CharField(verbose_name="姓名", max_length=16)
    name = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈")
    
    # 经常查询,速度快(MySQL,https://www.bilibili.com/video/BV15R4y1b7y9)
    name = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈", null=True, blank=True, db_index=True)
    email = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈", null=True, blank=True, unique=True)
    
    # 在数据库存储时只能是:sh、bj (上海、北京一般用于页面显示中文)
    code = models.CharField(verbose_name="姓名", max_length=16, choices=(("sh", "上海"), ("bj", "北京")),default="sh")
    python 复制代码
    # 不用 max_length=16
    count = models.IntegerField(verbose_name="数量", default=1, null=True, blank=True, unique=True)
    code = models.IntegerField(verbose_name="性别",choices=((1, "男"), (2, "女")),default=1)
    python 复制代码
    register_date = models.DateField(verbose_name="注册时间", auto_now=True)
    python 复制代码
    amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2)

示例:

python 复制代码
from django.db import models


class UserInfo(models.Model):
    name = models.CharField(verbose_name="姓名", max_length=16, db_index=True)
    age = models.PositiveIntegerField(verbose_name="年龄")
    email = models.CharField(verbose_name="邮箱", max_length=128, unique=True)
    amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)
    register_date = models.DateField(verbose_name="注册时间", auto_now=True)


class Goods(models.Model):
    title = models.CharField(verbose_name="标题", max_length=32)
    # detail = models.CharField(verbose_name="详细信息", max_length=255)
    detail = models.TextField(verbose_name="详细信息")
    price = models.PositiveIntegerField(verbose_name="价格")
    count = models.PositiveBigIntegerField(verbose_name="库存", default=0)
1.1.2 表关系

注意:ManyToManyField生成的表字段只能id/bid/gid

2.ORM

2.1 基本操作

orm,关系对象映射。

复制代码
类      --> SQL -->     表
对象    --> SQL -->     数据

特点:开发效率高、执行效率低( 程序写的垃圾SQL )。

编写ORM操作的步骤:

  • settings.py,连接数据库

    python 复制代码
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
  • settings.py,注册app

    复制代码
    INSTALLED_APP = [
    	...
    	"app01.apps.App01Config"
    ]
  • 编写models.类

    python 复制代码
    class UserInfo(models.Model):
        ....
        .....
  • 执行命令

    复制代码
    python manage.py makemigrations    # 找到所有已注册的app中的models.py中的类读取 -> migrations配置
    python manage.py migrate           # 读取已注册的app下的migrations配置 -> SQL语句  -> 同步数据库
2.2 连接数据库
python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxxxxxx',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'root123',
        'HOST': '127.0.0.1',  # ip
        'PORT': 3306,
    }
}

项目连接MySQL:

  • 安装MySQL & 启动MySQL服务

  • 手动创建数据库

  • django的settings.py配置

    python 复制代码
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'xxxxxxxx',  # 数据库名字
            'USER': 'root',
            'PASSWORD': 'root123',
            'HOST': '127.0.0.1',  # ip
            'PORT': 3306,
        }
    }
  • 安装第三方组件

    • pymysql

      复制代码
      pip install pymysql
      
      项目根目录/项目名目录/__init__.py
      	import pymysql
      	pymysql.install_as_MySQLdb()
    • mysqlclient

      复制代码
      pip install mysqlclient
      
      电脑上先提前安装MySQL。

其他数据库:

python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': 5432,
    }
}

# 需要 pip install psycopg2
python 复制代码
DATABASES = {
	'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': "xxxx",  # 库名
        "USER": "xxxxx",  # 用户名
        "PASSWORD": "xxxxx",  # 密码
        "HOST": "127.0.0.1",  # ip
        "PORT": 1521,  # 端口
    }
}
# 需要 pip install cx-Oracle
2.3 基础增删改查
python 复制代码
class Role(models.Model):
    title = models.CharField(verbose_name="标题", max_length=32)
2.3.1 增加
python 复制代码
import models
# 直接写入表中
obj1 = models.Role.objects.create(title="管理员",od=1)
obj2 = models.Role.objects.create(**{"title": "管理员", "od": 1})

# 先写入内容,然后写入表中
# odj1 = models.Role(title="客户", od=1)
obj1.od = 100
obj.save()

# odj1 = models.Role(**{title="客户", od=1})
obj1.od = 100
obj.save()

PS:ORM的filter,create等数据都是通过**kwargs接收参数,所以实参可用**字典传递

2.3.2 查找
python 复制代码
models.Role.objects.all() # select * from role
models.Role.objects.filter(属性=值) # select * from role where 属性=值 
moeels.Role.objects.filter(属性=值).first()  # select * from role where 属性=值 limit 1;
models.Role.objects.exclude(属性=值) # select * select * from role where 属性 != 值;

v3 = models.Role.objects.filter(id=99)
print(v3.query)

# > gt ⇒ >
v3 = models.Role.objects.filter(id__gt=2)
print(v3.query)

# gte ⇒ >=
v3 = models.Role.objects.filter(id__gte=2)
print(v3.query)

# lt ⇒ <
v3 = models.Role.objects.filter(id__lt=2)
print(v3.query)

# lte ⇒ <=
v3 = models.Role.objects.filter(id__lt=2)
print(v3.query)

# __in ⇒ 值是否在列表中
v3 = models.Role.objects.filter(id__in=[11, 22, 33])
print(v3.query)

# __contains ⇒ 字符是否存在于串中
v3 = models.Role.objects.filter(title__contains="户")
print(v3.query)

# __startswith ⇒ 是否以户开头
v3 = models.Role.objects.filter(title__startswith="户")
print(v3.query)

# __isnull ⇒ 字段是否为空
v3 = models.Role.objects.filter(title__isnull=True)
print(v3.query)


# .values(字段名表) 将所查询的符合条件的记录的指定字段以列表套字典形式的QuerySet对象返回
v4 = models.Role.objects.filter(id__ge=0).values("id","title")
# 返回<QuerySet[{'id':6,'title':'title6'},{'id':7,'title':'title7'}]>


# .values_list(字段名表) 将所查询的缩合条件的记录的指定字段以列表套元组形式的QuerySet对象返回
v5 = models.Role.objects.filter(id__ge=0).values_list('id','title')
# 返回<QuerySet[(6,'title6'),(7,'title7')]>
2.3.4 删除
python 复制代码
models.Role.objects.all().delete() # delete from role
models.Role.objects.filter(属性 = 值).delete() # delete from role where 属性 = 值;
2.3.4 修改
python 复制代码
models.Role.objects.filter(属性 = 值).update(属性 = 值) # update role set 属性 = 值 where 属性 = 值

models.Role.objects.filter(id=7).update(od=99, title="管理员")
models.Role.objects.filter(id=7).update(**{"od": 99, "title": "管理员"})
相关推荐
oradh18 分钟前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789861 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD1 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward2 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记2 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发3 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB3 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
Database_Cool_3 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云
会编程的土豆4 小时前
数据库范式
数据库·oracle
L1624764 小时前
MySQL 全环境生产快速安装 + 完整配置手册(整合国产银河麒麟适配 + 主从补充版)
数据库·mysql