Django的ORM操作

news/2025/2/22 0:06:55/

文章目录

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

1.ORM操作

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

在这里插入图片描述

1.1 表结构

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

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

  • 编写类

    from django.db import modelsclass UserInfo(models.Model):name = models.CharField(max_length=16)age = models.IntegerField()
    
  • 注册app

    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 manage.py migrate
    
    • 那个数据库?
    • 数据库账户和密码?
    DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}
    }
    

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

1.1.1 常见字段和参数
  • 字段

    CharFieldSmallIntegerField
    IntegerField
    BigIntegerFieldDateField
    DateTimeFieldBooleanField  -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1DecimalField  -> 精确的小数
    
  • 参数

    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")
    
    # 不用 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)
    
    register_date = models.DateField(verbose_name="注册时间", auto_now=True)
    
    amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2)
    

示例:

from django.db import modelsclass 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,连接数据库

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

    INSTALLED_APP = [..."app01.apps.App01Config"
    ]
    
  • 编写models.类

    class UserInfo(models.Model):.........
    
  • 执行命令

    python manage.py makemigrations    # 找到所有已注册的app中的models.py中的类读取 -> migrations配置
    python manage.py migrate           # 读取已注册的app下的migrations配置 -> SQL语句  -> 同步数据库
    
2.2 连接数据库
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}
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配置

    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__.pyimport pymysqlpymysql.install_as_MySQLdb()
      
    • mysqlclient

      pip install mysqlclient
      
      电脑上先提前安装MySQL。
      

其他数据库:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql','NAME': 'mydatabase','USER': 'mydatabaseuser','PASSWORD': 'mypassword','HOST': '127.0.0.1','PORT': 5432,}
}# 需要 pip install psycopg2
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 基础增删改查
class Role(models.Model):title = models.CharField(verbose_name="标题", max_length=32)
2.3.1 增加
import models
obj = models.Role.objects.create(属性=,....)
2.3.2 查找
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 属性 != 值;
2.3.4 删除
models.Role.objects.all().delete() # delete from role
models.Role.objects.filter(属性 =).delete() # delete from role where 属性 = 值;
2.3.4 修改
models.Role.objects.filter(属性 =).update(属性 =) # update role set 属性 = 值 where 属性 = 值

http://www.ppmy.cn/news/1212604.html

相关文章

热力学统计物理专业英语词汇

热力学统计物理专业英语词汇 work功entropy熵isobaric等压isothermal等温isochoric等容adiabatic绝热enthalpy焓free energy自由能surroundings外界gibbs energy吉布斯自由能heat capacity热容heat reservoir热源phasse相equilibrium平衡specific capacity比热expansivity膨胀系…

1204. 错误票据

题目: 1204. 错误票据 - AcWing题库 思路: 将输入的数据存入数组,从小到大排序后遍历,若 (a[i] a[i - 1])res1 a[i]--->重号;若(a[i] - a[i - 1] > 2)res2 a[i] - 1--->断号。 难点:题目只告诉我们输入…

FreeSWITCH 卡通道(通道死锁)完美解决

之前已经写过2篇博客分析这个问题 https://blog.csdn.net/iyaosan/article/details/132115154 https://smartivr.blog.csdn.net/article/details/132093913 最近一个客户使用顶顶通空号识别 ,对接方式为 vos1->freeswitch(内含空号识别模块)->vos2 每天晚上…

游戏平台采集数据

首先,你需要在你的项目中添加Kotlin的网络库,例如OkHttp。你可以在你的build.gradle文件中添加以下依赖: dependencies {implementation com.squareup.okhttp3:okhttp:4.9.0 }然后,你可以使用以下代码来创建一个基本的网络爬虫&a…

Flutter实践一:package组织

1.架构概览 为了降低Flutter工程里lib的复杂度,应尽量拆分一些代码成为独立的package。如图: 我们将通用的组件、领域模型、API、features、存储、repository等抽取成了单独的package。这时lib只剩下多国语言、基本的页面、路由等代码了: 这…

HCIE-Rainbow迁移工具

Rainbow迁移工具 Rainbow迁移工具支持p2v(物理机到虚拟机的迁移) v2v(虚拟机到虚拟机的迁移) Rainbow迁移是整机迁移,不会单独迁移上层的业务,也不会单独迁移数据,只会迁移整个虚拟机或者磁盘。…

macOS使用conda初体会

最近在扫盲测序的一些知识 其中需要安装一些软件进行练习,如质控的fastqc,然后需要用conda来配置环境变量和安装软件。记录一下方便后续查阅学习 1.安装miniconda 由于我的电脑之前已经安装了brew,所以我就直接用brew安装了 brew install …

计算机组成原理之处理器(流水线)

引言 为什么不采用单周期实现,硬件比较简单? 主要是因为效率太低,处理器中最长的路径(一般是ld指令)决定了时钟周期 流水线概述 流水线是一种能使多条指令重叠执行的技术。 流水线更快的原因是所有的工作都在并行执行,所以单位…