Django——数据库

文章详细介绍了在Django框架中如何使用ORM进行数据库操作,包括定义模型类、创建数据、查询数据(如使用values_list(),filter(),order_by(),aggregate()等),以及修改和删除数据的方法,展示了基本的CRUD操作和高级查询技巧。
摘要由CSDN通过智能技术生成

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提供了数据库迁移功能。通过执行makemigrationsmigrate命令,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)

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值