Django系列 | [6]ORM django fsm
liuian 2024-12-17 15:01 16 浏览
下面会从这几部分来介绍ORM:
- Django ORM简介
- Django ORM的安装和配置
- 基本操作
- 数据查询
- 多表关联
- 数据库迁移
- 总结
1. Django ORM简介
Django ORM(Object Relational Mapping)是Django框架自带的一种ORM工具,用于将Python对象映射到数据库中的关系数据模型中。使用Django ORM,你可以通过Python对象来对数据库进行操作,而无需编写原始的SQL语句。
Django ORM提供了许多有用的特性,如对象关系映射、数据库迁移和查询API等。在使用Django ORM时,你不必关心底层数据库的操作,而只需定义模型类和查询条件即可。
2. Django ORM的安装和配置
Django ORM是Django框架自带的工具,因此不需要额外安装。但是,在使用Django ORM之前,你需要确保你已经安装了Django框架,并在settings.py文件中配置了数据库连接。
下面是一个简单的数据库配置示例,其中使用了SQLite数据库:
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
3. 基本操作
在使用Django ORM之前,你需要定义模型类来表示数据库中的表。模型类需要继承自django.db.models.Model类,并定义字段和属性。下面是一个简单的模型类定义示例:
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
pub_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
上面的代码定义了一个名为Book的模型类,它有四个字段:title、author、pub_date和price。其中,title和author是CharField类型的字段,用于存储字符串类型的数据;pub_date是DateField类型的字段,用于存储日期类型的数据;price是DecimalField类型的字段,用于存储十进制数类型的数据。
在定义完模型类后,你需要使用Django的ORM API来对数据库进行操作。下面是一些常见的ORM操作示例:
创建数据
要创建一个新的Book对象并将其保存到数据库中,可以使用以下代码:
book = Book(title='The Great Gatsby', author='F. Scott Fitzgerald', pub_date='1925-04-10', price=25.00)
book.save()
更新数据
要更新数据库中的现有对象,可以使用以下代码:
book = Book.objects.get(pk=1)
book.title = 'The Catcher in the Rye'
book.save()
删除数据
要从数据库中删除现有对象,可以使用以下代码:
book = Book.objects.get(pk=1)
book.delete()
4. 数据查询
Django ORM提供了一组强大的查询API,可以用于从数据库中检索数据。以下是一些常见的查询操作示例:
获取所有对象
要从数据库中获取一个模型类的所有对象,可以使用以下代码:
books = Book.objects.all()
根据条件获取对象
要根据条件从数据库中获取一个或多个对象,可以使用以下代码:
# 获取title为'1984'的Book对象
book = Book.objects.get(title='1984')
# 获取pub_date在2022年之后的所有Book对象
books = Book.objects.filter(pub_date__gt='2022-01-01')
对查询结果进行排序
要对查询结果进行排序,可以使用以下代码:
# 获取所有Book对象,并按照价格从低到高排序
books = Book.objects.all().order_by('price')
对查询结果进行聚合
要对查询结果进行聚合操作,可以使用以下代码:
from django.db.models import Avg, Max, Min, Sum
# 获取所有Book对象的价格平均值
avg_price = Book.objects.all().aggregate(Avg('price'))
# 获取所有Book对象的价格最高值和最低值
max_price = Book.objects.all().aggregate(Max('price'))
min_price = Book.objects.all().aggregate(Min('price'))
# 获取所有Book对象的价格总和
total_price = Book.objects.all().aggregate(Sum('price'))
5. 多表关联
在实际应用中,一个模型类通常会与其他模型类存在关联。Django ORM提供了一组强大的多表关联API,可以用于表示和管理模型类之间的关系。以下是一些常见的多表关联操作示例:
一对多关系
假设有一个Author模型类和一个Book模型类,它们之间是一对多的关系(即一个作者可以写多本书)。可以使用ForeignKey字段来表示这种关系:
class Author(models.Model):
name = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
在上面的代码中,Book模型类包含一个ForeignKey字段,它引用了Author模型类。on_delete=models.CASCADE参数表示当关联的Author对象被删除时,与之相关的Book对象也将被删除。
要获取一个Author对象的所有Book对象,可以使用以下代码:
author = Author.objects.get(pk=1)
books = author.book_set.all()
多对多关系
假设有一个Book模型类和一个Tag模型类,它们之间是多对多的关系(即一本书可以有多个标签,一个标签也可以应用于多本书)。可以使用ManyToManyField字段来表示这种关系:
class Tag(models.Model):
name = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=100)
tags = models.ManyToManyField(Tag)
在上面的代码中,Book模型类包含一个ManyToManyField字段,它引用了Tag模型类。Django ORM会自动创建一个中间表,用于存储Book和Tag之间的关联关系。
要获取一个Book对象的所有Tag对象,可以使用以下代码:
book = Book.objects.get(pk=1)
tags = book.tags.all()
一对一关系
假设有一个Person模型类和一个Passport模型类,它们之间是一对一的关系(即每个人只有一个护照,每个护照也只属于一个人)。可以使用OneToOneField字段来表示这种关系:
class Person(models.Model):
name = models.CharField(max_length=50)
class Passport(models.Model):
number = models.CharField(max_length=50)
person = models.OneToOneField(Person, on_delete=models.CASCADE)
在上面的代码中,Passport模型类包含一个OneToOneField字段,它引用了Person模型类。on_delete=models.CASCADE参数表示当关联的Person对象被删除时,与之相关的Passport对象也将被删除。
要获取一个Person对象的Passport对象,可以使用以下代码:
person = Person.objects.get(pk=1)
passport = person.passport
6. 数据库迁移
在实际应用中,模型类经常需要进行修改。Django ORM提供了一个称为“数据库迁移”的机制,可以帮助我们轻松地将这些修改应用到数据库中。以下是一些常见的数据库迁移操作示例:
创建迁移文件
要创建一个迁移文件,可以使用以下代码:
python manage.py makemigrations
该命令将自动检测模型类的更改,并创建一个迁移文件,用于记录这些更改。迁移文件将保存在一个名为“migrations”的目录中。
应用迁移文件
要将迁移文件应用到数据库中,可以使用以下代码:
python manage.py migrate
该命令将自动执行迁移文件中的操作,并将更改应用到数据库中。
回滚迁移文件
如果需要回滚迁移文件(即撤消已应用的更改),可以使用以下代码:
python manage.py migrate app_name <migration_name>
其中,app_name是模型类所在的应用程序名称,migration_name是要回滚的迁移文件的名称。
7. 总结
本教程介绍了Django ORM的基本用法,包括定义模型类、数据增删改查、多表关联和数据库迁移等方面。Django ORM是Django框架的核心组件之一,它提供了一组强大的API,可以帮助我们轻松地与数据库进行交互。
相关推荐
- HR必备Excel函数:4个与日期相关的计算函数。
-
提到日期函数,很多人首先会想到“today”,它可以显示当天的日期,并且每次打开表格时都会自动更新。但是,对于前天、昨天、明天和后天的日期,就不能用yesterday或者tomorrow等这些英文了,...
- 这篇文章有点长,但可以让你十分钟玩转Excel的时间函数
-
日期与时间函数——TODAY、NOW、YEAR、MONTH、DAY!如何用WORKDAY函数查询距离某天的第20个工作日是哪一天?如何用NETWORKDAYS函数查询员工工作了多少个工作日?如何用WE...
- Excel2020年日历套装,表格设计,农历显示,查阅套打轻松应用
-
Hello大家好,我是帮帮。今天跟大家分享一组Excel2020年日历套装,表格设计,自带农历控件,查阅套打轻松应用。有个好消息!为了方便大家更快的掌握技巧,寻找捷径。请大家点击文章末尾的“了解更多”...
- 巧用NETWORKDAYS函数计算两个日期之间工作日的天数
-
带有日期的单元格是我们日常使用EXCEL的时候经常见到的,有的时候我们需要求出两个日期之间间隔的天数,可以直接用结束日期减去开始日期即可,这是个非常简单的减法公式。不过这个单纯的减法公式会默认去掉开始...
- Excel按工作日、休息日进行汇总
-
1、按周六日/其它时间汇总为了区分一周的周六日和其它时间,可以使用WEEKDAY函数,把WEEKDAY函数的第2个参数指定为2,如WEEKDAY(A3,2),则周一返回1,周二返回2,…,周六返回...
- 如何计算每月应出勤天数,如有法定假期和调休,如何计算
-
本文介绍如何计算每月的应出勤天数。第一部分介绍正常双休制下计算应出勤天数;第二部份介绍当月有法定假期和调休的情况下计算应出勤天数。一、计算正常双休制的应出勤天数如下图所示,要求计算各员工2021年3月...
- 《Excel一键生成工作日历:让会议排期更轻松!》
-
每当需要安排会议时,总要翻看日历确认工作日,再逐个标注会议时间,既耗时又容易出错。今天教大家用Excel快速生成工作日历表,让会议排期变得简单高效!一、快速生成日历框架创建基础日期:在A1单元格输入月...
- 如何计算指定日期区间内,有多少工作日和休息日?
-
大家好,今天咱们要解决的问题是如何计算给定的一段日期内,正常工作日有多少天,放假时间有多少天?比如咱们要计算2025年3月份工作日一共有多少天,又有多少天放假,如下图所示:通过肉眼我们可以数清楚,20...
- 如何如何在表格中自动突出显示双休日?
-
现在不少人喜欢用Excel来制作备忘录或安排工作事项。在表格中输入日期后,可以使用条件格式突出显示双休日,避免在休息日安排了工作。具体方法是这样的:第1步:选择要设置条件格式的日期单元格区域;在“开始...
- excel函数技巧:networkdays.intl判断节假日
-
如图,想知道6月的每一天是否是节假日,公式如下:=NETWORKDAYS.INTL(A2,A2,1,$E$2:$E$28)这个函数既可以判断当前日期(一参=二参)是否是周末及工作日(三参、四参)还可得...
- 仅需3步,让考勤表根据实际休息日,自动地填充颜色
-
Hello,大家好,之前跟大家分享了我们如何让考勤表根据单休与双休自动的填充颜色,最近有粉丝问到:能不能让考勤表根据实际的休息日自动的填充颜色呢?可以是可以,只不过因为牵扯到假期调休,我们每年的休息日...
- 5步搞定动态考勤表!标记节假日、调休日?Excel自动变色!
-
今天教你用「动态考勤表」一招解决所有问题!只需输入月份,自动变色、自动更新节假日,从此告别加班,效率翻倍!动态考勤表的优势:自动变色:节假日、双休日一键标记,颜色分明。一表多用:修改月份即可...
- 一起用python做个炫酷音乐播放器,想听啥随便搜
-
前言前段时间写的Python自制一款炫酷音乐播放器,有不少小伙伴私信我,对播放器提了不少改进建议,让我完善播放器的功能。今天音乐播放器2.0版本完成了,大家一起来看看是如何用python自制一款炫酷的...
- 用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)
-
桌面太单调?今天就带大家,一起用Python的PyQt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果!下面,我们开始介绍这个自定义桌面动画挂件的制作过程。一、核心功能设计实现将动态图gif...
- Python串口调试助手源码分享
-
以下是一个基于Python和PyQt5实现的串口调试助手示例,包含核心功能实现代码:pythonimportsysimportserialfromPyQt5.QtCoreimportQTim...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- react-admin (33)
- vscode切换git分支 (35)
- vscode美化代码 (33)
- python bytes转16进制 (35)