Django的ORM操作

文章目录

    • 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.hqwc.cn/news/169360.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Reeds-Shepp曲线

汽车都有一个最小转向半径,Reeds-Shepp曲线由几段半径固定的圆弧和一段直线段拼接组成,而且圆弧的半径就是汽车的最小转向半径。从起始点到目标点的路径长度是指汽车中心运动轨迹的长度,也就是所有圆弧的弧长和直线段的长度之和。 当环境中…

GoF之代理模式

2023.11.12 代理模式是GoF23种设计模式之一,其作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以…

一键创建PDF文档,高效管理您的文件资料

在繁忙的工作中,您是否曾为处理PDF文件而感到烦恼?现在,我们为您推荐一款全新的高效PDF文档管理工具——一键创建PDF文档,让您的工作效率瞬间提升! 首先,在首助编辑高手的主页面板块栏里,选择“…

华为ensp:ppp+CHAP认证

如果一头开启了认证,如果对面没有输入认证则双方无法通信 开启ppp r1和r2在系统视图模式进行同样的操作 interface Serial 1/0/0 link-protocol pppquit 开启ppp R1 去r1设置chap认证用户和密钥 进入系统视图 interface Serial 1/0/0 ppp authentication-m…

【C++笔记】优先级队列priority_queue的模拟实现

【C笔记】优先级队列priority_queue的模拟实现 一、优先级队列的介绍与使用方式1.1、优先级队列介绍1.2、优先级队列的常见使用 二、优先级队列的模拟实现1.0、仿函数的介绍1.1、构造函数1.2、优先级队列的插入push1.3、优先级队列的删除(删除堆顶元素)1.4、获取堆顶元素1.5、判…

01:2440----点灯大师

目录 一:点亮一个LED 1:原理图 2:寄存器 3:2440的框架和启动过程 A:框架 B:启动过程 4:代码 5:ARM知识补充 6:c语言和汇编的应用 A:代码 B:分析汇编语言 C:内存空间 7:内部机制 二:点亮2个灯 三:流水灯 四:按键控制LED 1:原理图 2:寄存器配置 3:代码 一:点…

python实现炒股自动化,个人账户无门槛量化交易的开始

本篇作为系列教程的引子,对股票量化程序化自动交易感兴趣的朋友可以关注我,现在只是个粗略计划,后续会根据需要重新调整,并陆续添加内容。 股票量化程序化自动交易接口 很多人在找股票个人账户实现程序化自动交易的接口&#xff0…

Django——orm模块创建表关系

django orm中如何创建表关系 1. 表关系分析 表与表之间的关系: 一对多 多对多 一对一 没有关系 判断表关系的方法: 换位思考用4张表举例: 图书表 出版社表 作者表 作者详情表图书和出版社是一对多的关系 外键字段建在多的那一方图书和作者是多对多的关系 需要创建第三张表来…

(离散数学)命题及命题的真值

答案: (5)不是命题,因为真值不止一个 (6)不是命题,因为不是陈述句 (7)不是命题,因为不是陈述句 (8)不是命题,真值不唯一

Qt 自定义按钮 区分点按与长按信号,适配触摸事件

Qt 自定义按钮 区分点按与长按信号 适配触摸事件 效果 使用示例 // 点按connect(ui.btnLeft, &JogButton::stepclicked, this, &MainWindow::btnLeft_clicked);// 长按开始connect(ui.btnLeft, &JogButton::continueOn, this, &MainWindow::slotJogLeftOn);//…

Linux 基于 LVM 逻辑卷的磁盘管理【简明教程】

一、传统磁盘管理的弊端 传统的磁盘管理:使用MBR先对硬盘分区,然后对分区进行文件系统的格式化最后再将该分区挂载上去。 传统的磁盘管理当分区没有空间使用进行扩展时,操作比较麻烦。分区使用空间已经满了,不再够用了&#xff…

Qt 事件循环

引出 UI程序之所叫UI程序,是因为需要与用户有交互,用户交互一般是通过鼠标键盘等的输入设备,那UI程序就需要有能随时响应用户交互的能力。 一个C程序的main函数大概是下面这样: int main() {...return 0; } 我们如何使程序能随…