Django——数据库
Django中的数据库是一个核心组件,它允许开发人员以结构化和有组织的方式存储、检索、更新和删除数据。以下是对Django数据库的详细介绍:
一、数据库的基本概念
数据库是统一管理的、长期储存在计算机内的、有组织的相关数据的集合。数据库系统由数据库、硬件、软件和人员四部分组成。数据库管理系统(DBMS)是数据库系统的核心软件,它负责科学地组织和存储数据,并提供数据访问的接口。
二、Django中的数据库
Django是一个基于Python的开源Web应用程序框架,它遵循MTV(模型-模板-视图)设计模式。在Django中,数据库的作用尤为重要,因为所有持久化数据都存储在数据库中。
1. 数据库配置
Django允许开发人员根据项目需求配置不同的数据库。默认情况下,Django使用SQLite3作为数据库引擎,但也可以通过修改settings.py
文件中的DATABASES
配置项来配置MySQL、PostgreSQL等数据库。
配置MySQL数据库的示例(以Django 4.x版本为例):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_database_name', # 数据库名
'USER': 'your_database_user', # 数据库用户
'PASSWORD': 'your_database_password', # 数据库密码
'HOST': 'localhost', # 数据库主机,本地为localhost
'PORT': '3306', # 数据库端口,MySQL默认端口为3306
}
}
注意:使用MySQL数据库时,需要安装并配置相应的Python驱动,如PyMySQL或mysqlclient。
2. 模型(Models)
在Django中,模型是定义数据结构的地方。每个模型类都映射到数据库中的一个表,而模型类的属性则对应表中的字段。通过模型层,开发人员可以定义数据的结构、字段类型、约束等。
定义模型类的示例:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
在这个例子中,Person
模型类映射到数据库中的一个表,表中包含两个字段:name
(字符串类型,最大长度为100)和age
(整数类型)。
3. ORM(对象关系映射)
Django内置了ORM框架,它允许开发人员使用面向对象的方式来操作数据库。ORM将数据库表映射为Python类,将表中的行映射为类的实例(对象),将表中的字段映射为类的属性。通过ORM,开发人员可以编写更加简洁、易于理解的代码来操作数据库。
ORM的主要优势包括:
- 简化数据库操作:开发人员可以使用Python代码来执行数据库的增删改查操作,而无需编写SQL语句。
- 提高开发效率:ORM提供了丰富的API和工具,如数据校验、查询优化等,可以帮助开发人员更快地开发应用程序。
- 提高代码的可读性和可维护性:ORM代码更加接近自然语言和面向对象编程的思维方式,使得代码更加易于理解和维护。
4. 数据库迁移
在Django中,模型类的修改(如添加或删除字段)不会自动反映到数据库中。为了将模型类的修改应用到数据库中,Django提供了数据库迁移功能。通过执行makemigrations
和migrate
命令,Django可以生成并执行迁移文件,从而更新数据库结构以匹配模型类的定义。
三、总结
Django中的数据库是一个核心组件,它允许开发人员以结构化和有组织的方式存储和访问数据。通过配置不同的数据库引擎、定义模型类和使用ORM框架,Django为开发人员提供了一套完整的数据库操作解决方案。
class Book(models.Model):
book_name = models.CharField(max_length=20)
price = models.DecimalField(max_digits=5 , decimal_places=2)
inventory = models.IntegerField()
# auto_now_add 设置为 True , 在创建数据的时候设置当前时间 ,后续对应的字段修改数据 ,该时间不会变化
create_time = models.DateField(auto_now_add=True)
# auto_now 设置为 True , 在创建数据的时候设置当前时间 ,
# 后续对应的字段修改数据 ,该时间也会跟着跟新为修改后的时间
update_time = models.DateField(auto_now=True)
# DateField 设置了 auto_now_add 和 auto_now 属性之后 ,在新增数据的时候可以不手动添加
class Meta:
db_table = 'book'
Book.objects.create(book_name='白夜行' , price=98.95 , inventory=520)
Book.objects.create(book_name='挪威的森林' , price=80.6 , inventory=510)
Book.objects.create(book_name='解忧杂货店' , price=53.25 , inventory=623)
Book.objects.create(book_name='三体' , price=120.5 , inventory=630)
Book.objects.create(book_name='平凡的世界' , price=100.66 , inventory=100)
Book.objects.create(book_name='人生的枷锁' , price=75.98 , inventory=50)
Book.objects.create(book_name='追风筝的人' , price=46.33 , inventory=751)
Book.objects.create(book_name='月亮与六便士' , price=75.98 , inventory=60)
Book.objects.create(book_name='三国演义' , price=88.65 , inventory=751)
Book.objects.create(book_name='摆渡人' , price=30.12 , inventory=630)
# 查询数据
# 使用 all 查询表格中的所有数据
# values() 将数据以字典对象的方式显示
# values_list() 将数据以元组对象的方式显示
get_data = Book.objects.all().values_list()
# print(get_data)
get_data = Book.objects.filter(book_name='三体')
# print(get_data.values_list())
# get方法 , 获取单条数据 , 给定的条件也只能在数据表中是唯一的
# 如果不唯一 , 则抛出异常
get_data = Book.objects.get(id='6')
print(get_data)
print(get_data.book_name)
# 排序: order_by , 默认情况是升序排序
data = Book.objects.order_by('price')
for d in data:
print(d.book_name , d.price)
print('*'*20)
# 降序排序 , 在指定的属性名前面加上 '-'
data = Book.objects.order_by('-price')
for d in data:
print(d.book_name, d.price)
print('*' * 20)
# reverse ,排序翻转,将升序变成降序 , 降序变为升序
data = Book.objects.order_by('price').reverse()
for d in data:
print(d.book_name, d.price)
修改数据
先获取到数据对象 , 再通过对象进行修改
# 大小比较
# 大于 : gt
data = Book.objects.filter(price__gt=80)
# print(data)
# 大于等于 :gte
data = Book.objects.filter(price__gte=75.98)
# print(data)
# 小于 : lt
data = Book.objects.filter(price__lt=75.98)
print(data)
# 小于等于 :lte
data = Book.objects.filter(price__lte=75.98)
print(data)
data = Book.objects.get(id=2)
# 使用对象.属性名进行重新赋值的操作
data.price= 75.23
# data.save()
# update() 方法修改 , 这个方法可以一次性修改多条数据
data = Book.objects.filter(id=5)
# data.update(inventory=300)
data = Book.objects.filter(id__in=[3 , 8 , 9])
data.update(inventory=300)
count 获取到查询的数据对象个数
直接查询整个表中有多少条数据
data = Book.objects.count()
print(data)
data = Book.objects.filter(price__gt=80).count()
print(data)
# 对查询得到的数据对象查询集进行切片
data = Book.objects.all()
print(data)
print(data[0:4])
data = Book.objects.filter(id__range=(0 , 4))
print(data)
print(data[2])
# F 表达式 ,直接在数据库中完成修改操作 , 不会将数据对象从数据库中读取到 Python 的内存中
from django.db.models import F
data = Book.objects.get(id=10)
data.inventory = F('inventory') + 520
data.save()
聚合函数
要使用聚合函数查询的时候需要和 aggregate 方法使用
from django.db.models import Max , Min , Sum , Avg
# 集合函数查询返回的结果是一个字典
# 字典的键是默认为: 字段名__聚合函数名
data = Book.objects.aggregate(Max('price'))
print(data)
data = Book.objects.filter(id__in=[1 , 5 , 7]).aggregate(Avg('price'))
print(data)
# 自定义集合函数查询结果的键名
data = Book.objects.filter(id__in=[1, 5, 7]).aggregate(price = Avg('price'))
print(data)
删除数据 delete 方法
先获取到要删除的数据对象 , 然后再使用 delete 方法
data = Book.objects.get(id=4).delete()
print(data)
data = Book.objects.all().delete()
print(data)