django从入门到实战(四)——模型与数据库
1. 模型的定义与数据迁移
1.1 模型的定义
在 Django 中,模型是一个 Python 类,用于定义数据库中的数据结构。每个模型类对应数据库中的一张表,类的属性对应表中的字段。
示例:
from django.db import modelsclass Blog(models.Model):title = models.CharField(max_length=200) # 标题content = models.TextField() # 内容created_at = models.DateTimeField(auto_now_add=True) # 创建时间updated_at = models.DateTimeField(auto_now=True) # 更新时间def __str__(self):return self.title
参数说明:
models.Model: 所有模型类都需要继承自models.Model。CharField: 用于存储字符串,max_length是必需的参数。TextField: 用于存储长文本。DateTimeField: 用于存储日期和时间,auto_now_add和auto_now分别表示在创建和更新时自动设置当前时间。
1.2 数据迁移
数据迁移是将模型的变化应用到数据库的过程。Django 提供了命令行工具来管理迁移。
步骤:
- 创建迁移文件:
python manage.py makemigrations
- 应用迁移:
python manage.py migrate
1.3 开发自己的 ORM 框架
开发自己的 ORM 框架涉及创建一个类来映射数据库表,并实现基本的 CRUD 操作。以下是一个简单的示例:
import sqlite3class SimpleORM:def __init__(self, db_name):self.connection = sqlite3.connect(db_name)self.cursor = self.connection.cursor()def create_table(self, table_name, columns):columns_with_types = ', '.join([f"{name} {dtype}" for name, dtype in columns.items()])self.cursor.execute(f"CREATE TABLE IF NOT EXISTS {table_name} ({columns_with_types})")self.connection.commit()def insert(self, table_name, data):placeholders = ', '.join(['?'] * len(data))self.cursor.execute(f"INSERT INTO {table_name} VALUES ({placeholders})", tuple(data.values()))self.connection.commit()def fetch_all(self, table_name):self.cursor.execute(f"SELECT * FROM {table_name}")return self.cursor.fetchall()def close(self):self.connection.close()
参数说明:
db_name: 数据库名称。table_name: 表名。columns: 字典,键为列名,值为数据类型。data: 字典,键为列名,值为要插入的数据。
1.4 数据导入和导出
数据导入和导出可以通过 CSV 文件或其他格式进行。
导出示例:
import csvdef export_to_csv(data, filename):with open(filename, mode='w', newline='') as file:writer = csv.writer(file)writer.writerows(data)
导入示例:
def import_from_csv(filename):with open(filename, mode='r') as file:reader = csv.reader(file)return list(reader)
2. 数据表关系
在数据库中,表之间可以有不同的关系,主要包括:
- 一对一关系:一个表中的一条记录对应另一个表中的一条记录。
- 一对多关系:一个表中的一条记录可以对应另一个表中的多条记录。
- 多对多关系:两个表中的记录可以相互对应多条记录。
示例
class Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE) # 一对多关系
3. 数据表操作
3.1 增删改查(CRUD)
增加
# 创建新博客
new_blog = Blog(title="My First Blog", content="This is the content.")
new_blog.save()
查询
# 查询所有博客
all_blogs = Blog.objects.all()# 查询特定博客
specific_blog = Blog.objects.get(id=1)
更新
# 更新博客内容
specific_blog.content = "Updated content."
specific_blog.save()
删除
# 删除博客
specific_blog.delete()
3.2 多表查询
使用 Django 的 ORM 可以轻松进行多表查询。
# 查询某个作者的所有书籍
author_books = Book.objects.filter(author__name="Author Name")
4. 数据库与 SQL 语句
4.1 SQL 语句
SQL(结构化查询语言)用于与数据库交互。常用的 SQL 语句包括:
- SELECT:查询数据。
- INSERT:插入数据。
- UPDATE:更新数据。
- DELETE:删除数据。
4.2 数据库事务
事务是一组操作,要么全部成功,要么全部失败。Django 提供了事务管理的支持。
from django.db import transactionwith transaction.atomic():# 执行多个数据库操作blog = Blog(title="Transactional Blog", content="Content")blog.save()# 其他操作
5. Django 如何制作多个数据库的链接和使用
在 Django 中,可以在 settings.py 中配置多个数据库。
示例配置
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / "db.sqlite3",},'secondary': {'ENGINE': 'django.db.backends.postgresql','NAME': 'mydatabase','USER': 'myuser','PASSWORD': 'mypassword','HOST': 'localhost','PORT': '5432',}
}
使用示例
from django.db import connectionswith connections['secondary'].cursor() as cursor:cursor.execute("SELECT * FROM my_table")rows = cursor.fetchall()
6. 动态创建模型和数据表
动态创建模型和数据表可以通过 Django 的 type 函数和 create_model 方法实现。
示例
from django.db import models, connectiondef create_dynamic_model(table_name):class Meta:db_table = table_nameattrs = {'__module__': __name__, 'Meta': Meta}model = type(table_name.capitalize(), (models.Model,), attrs)return model# 创建动态模型
DynamicModel = create_dynamic_model('dynamic_table')
7. MySQL 分表功能
MySQL 分表是将数据分散到多个表中,以提高性能和管理性。可以通过水平分表和垂直分表实现。
水平分表示例
假设我们有一个用户表,可以根据用户 ID 进行分表:
CREATE TABLE users_1 LIKE users;
CREATE TABLE users_2 LIKE users;INSERT INTO users_1 SELECT * FROM users WHERE id % 2 = 0;
INSERT INTO users_2 SELECT * FROM users WHERE id % 2 = 1;
垂直分表示例
将用户表中的某些字段分到另一个表中:
CREATE TABLE user_profiles (user_id INT PRIMARY KEY,profile_picture VARCHAR(255),bio TEXT,FOREIGN KEY (user_id) REFERENCES users(id)
);
相关文章:
django从入门到实战(四)——模型与数据库
1. 模型的定义与数据迁移 1.1 模型的定义 在 Django 中,模型是一个 Python 类,用于定义数据库中的数据结构。每个模型类对应数据库中的一张表,类的属性对应表中的字段。 示例: from django.db import modelsclass Blog(models…...
LeetCode:1008. 前序遍历构造二叉搜索树
目录 题目描述: 代码: 第一种: 第二种: 第三种:分治法 题目描述: 给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。 保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。 二叉搜索树 是一棵…...
gdb - 调试工具 - 入门 (一)
GDB(GNU Debugger)是GNU项目调试器的缩写,它是Linux下一个强大的C/C(以及其他语言如Fortran)程序调试工具。以下是对GDB的详细解释: 一、GDB的功能 GDB允许开发者对程序执行进行深入控制,可以…...
Swift内存访问冲突
内存的访问,发生在给变量赋值的时候,或者传递值(给函数)的时候,例如 var one 1//向one的内存区域发起一次写的操作 print("\(one)")//向one的内存区域发起一次读的操作 在 Swift 里,有很多修改…...
深入理解Spring(三)
目录 2.1.3、Spring配置非自定义Bean 1)配置Druid数据源交由Spring管理 2)配置Connection交由Spring管理 3)配置日期对象交由Spring管理 4)配置MyBatis的SqlSessionFactory交由Spring管理 2.1.4、Bean实例化的基本流程 1)Bean信息定义对象-BeanDefinition 2)DefaultLi…...
TB6612电机驱动模块使用指南
实物图: 简介:TB6612是一款双路H桥型直流电机驱动模块,可以控制两个直流电机的转速和方向 H桥:(双路H桥就是有两个这个结构) 引脚图:...
Paper -- 洪水深度估计 -- 利用图像处理和深度神经网络绘制街道照片中的洪水深度图
基本信息 论文题目:Flood depth mapping in street photos with image processing and deep neural networks 中文题目: 利用图像处理和深度神经网络绘制街道照片中的洪水深度图 作者及单位: Bahareh Alizadeh Kharazi,美国得克萨斯州立大…...
学习C#中的BackgroundWorker 组件
1. BackgroundWorker 组件概述 许多经常执行的操作可能需要很长的执行时间。 例如: 图像下载 Web 服务调用 文件下载和上载(包括点对点应用程序) 复杂的本地计算 数据库事务 本地磁盘访问(相对于内存访问来说其速度很慢&…...
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
大家好,欢迎来到程序视点!我是小二哥! 前言 在VUE项目开发中,一些数据常常被多个组件频繁使用,为了管理和维护这些数据,就出现了状态管理模式。 今天小二哥要给大家推荐的不是VueX,而是称为新…...
PCB 间接雷击模拟
雷击是一种危险的静电放电事件,其中两个带电区域会瞬间释放高达 1 千兆焦耳的能量。雷击就像一个短暂而巨大的电流脉冲,会对建筑物和电子设备造成严重损坏。雷击可分为直接和间接两类,其中间接影响是由于感应能量耦合到靠近雷击位置的物体。间…...
JAVA泛型和顺序表ArrayList
目录 泛型 泛型的定义: 泛型的实例化: 泛型的使用: 顺序表ArrayList 顺序表ArrayList的两种实例化方法: ArrayList常用的方法: 1. add 方法 2. size ( ) 方法 3. get 方法 4. set 方法 5. 顺序表的三种遍历元素的方法…...
Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
目录 1.1鼠标进入和离开enterEvent\leaveEvent 1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent 1.3定时器事件timerEvent 1.4定时器类QTimer 1.5事件分发器event 1.6事件过滤器eventFilter 1.1鼠标进入和离开enterEvent\leaveEvent 事件&#x…...
Javascript高级—深入JS模板字符串的高级用法
深入JS模板字符串的高级用法:解锁动态内容生成的无限可能 在JavaScript编程中,模板字符串(Template Literals)自ES6(ECMAScript 2015)引入以来,就以其简洁、直观的特性迅速成为开发者们生成动态…...
14. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--章节总结
本章重点介绍了如何在一个简单的系统中实现基本的权限管理功能。通过构建一个简单的权限控制模型,章节阐述了如何为用户分配权限,并在应用程序中进行访问控制。 一、关键要点: 1. 用户管理(登录/注册/Token) 本章节聚…...
vulhub之fastjson
fastjson 1.2.24 反序列化 RCE 漏洞(CVE-2017-18349) 漏洞简介 什么是json json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下: {"name":"BossFrank", "age":23, "isDevel…...
2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域
量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力,远远超过了经典计算机的能力。当与人工智能(AI)集成时,量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题,这对优化和…...
卷积神经网络各层介绍
目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU(Rectified Linear Unit) 3.2 sigmoid 3.3 tanh(双曲正切) 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核(滤波器)对矩阵进…...
Python应用指南:高德拥堵延时指数
随着城市化进程的加快,交通拥堵问题日益严重,成为影响城市居民生活质量的重要因素之一。为了科学评估和管理交通拥堵,各种交通拥堵指数应运而生。其中,高德地图提供的“拥堵延时指数”因其数据丰富、实时性强和应用广泛而备受关注…...
ISO 21434标准:汽车网络安全管理的利与弊
ISO 21434标准在提升汽车网络安全性方面起到了重要作用,但任何标准都不是完美无缺的,ISO 21434标准也存在一些不足之处。以下是对其不足之处的分析: 一、标准的灵活性与适应性 缺乏具体技术细节:ISO 21434标准更多地提供了网络安…...
无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)
在数字化时代,流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合,流媒体播放器的核心技术不断演进,为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器,是一款能够同时支持HTTP、…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
