在Web开发中,数据库操作是核心环节之一。Django作为Python的主流Web框架,提供了强大的ORM(对象关系映射)工具,让我们可以用Python代码直接操作数据库,无需编写复杂的SQL语句。而SQLite作为Django的默认数据库,轻量易用,非常适合开发和学习阶段使用(它无需单独安装服务器,直接以文件形式存储数据)。
一、准备工作:配置Django与SQLite¶
1. 新建Django项目¶
首先确保已安装Django,若未安装可通过pip install django安装。然后创建项目和应用:
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
2. 配置SQLite数据库¶
Django默认已配置SQLite数据库,无需额外安装。打开myproject/settings.py,确认DATABASES配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3', # SQLite数据库文件路径
}
}
3. 创建数据模型(Model)¶
在myapp/models.py中定义一个简单的模型(对应数据库表),例如用户信息表:
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100) # 字符串类型,需指定长度
age = models.IntegerField() # 整数类型
email = models.EmailField(unique=True) # 邮箱类型,unique=True表示唯一值
def __str__(self):
return self.name # 打印对象时显示用户名
4. 迁移模型到数据库¶
执行以下命令,将模型映射为SQLite表:
python manage.py makemigrations # 生成迁移文件
python manage.py migrate # 应用迁移,创建数据库表
二、Django ORM增删改查(CRUD)实战¶
增(Create):添加数据到数据库¶
方法1:直接创建并保存¶
使用模型类的objects.create()方法,直接创建并返回新对象:
# 在Django shell中执行(python manage.py shell)
from myapp.models import User
# 创建用户1
user1 = User.objects.create(
name="张三",
age=20,
email="zhangsan@example.com"
)
print(user1.id) # 输出新用户的ID(如1)
方法2:先实例化,再保存¶
先创建模型对象,然后调用save()方法保存:
# 创建用户2
user2 = User()
user2.name = "李四"
user2.age = 22
user2.email = "lisi@example.com"
user2.save() # 必须调用save()才会存入数据库
注意:create()适合快速添加单条数据,save()适合先设置部分字段后补充修改的场景。
查(Read):从数据库查询数据¶
1. 获取所有记录:all()¶
# 获取所有用户
all_users = User.objects.all()
for user in all_users:
print(user.name, user.age, user.email)
2. 按条件查询:filter()与get()¶
filter():返回符合条件的所有记录(返回QuerySet对象,类似列表)get():返回唯一符合条件的记录(若结果不存在或多个,会报错)
# 1. 获取年龄为20的用户
users = User.objects.filter(age=20)
for user in users:
print(user.name) # 输出:张三
# 2. 获取邮箱为zhangsan@example.com的用户
user = User.objects.get(email="zhangsan@example.com")
print(user.name) # 输出:张三
# 3. 带条件修饰符(双下划线__)
# age > 18
users = User.objects.filter(age__gt=18)
# age < 25
users = User.objects.filter(age__lt=25)
# 名字包含"张"
users = User.objects.filter(name__contains="张")
# 邮箱唯一(假设已设置unique=True)
user = User.objects.filter(email__exact="zhangsan@example.com") # 等同于get()
3. 排序与限制¶
order_by():排序(默认升序,加-为降序)first()/last():获取第一条/最后一条记录count():统计记录数
# 按年龄升序排列
users = User.objects.order_by("age")
# 按年龄降序排列
users = User.objects.order_by("-age")
# 获取年龄最大的用户
oldest = User.objects.order_by("-age").first()
# 统计用户总数
total = User.objects.count()
改(Update):更新数据库记录¶
方法1:先查询再修改(单条更新)¶
# 获取用户并修改
user = User.objects.get(id=1)
user.age = 21 # 修改年龄
user.save() # 保存修改
方法2:批量更新(update())¶
适用于修改多条记录,直接返回修改的行数:
# 将所有年龄为20的用户年龄改为21
updated_rows = User.objects.filter(age=20).update(age=21)
print(f"共修改了{updated_rows}条记录") # 输出:1
注意:update()是直接执行SQL的UPDATE语句,不会触发模型的save()方法或信号。
删(Delete):删除数据库记录¶
方法1:先查询再删除(单条删除)¶
# 删除ID为1的用户
user = User.objects.get(id=1)
user.delete()
方法2:批量删除(delete())¶
# 删除所有年龄为21的用户
deleted_rows = User.objects.filter(age=21).delete()
print(f"共删除了{deleted_rows[0]}条记录") # 输出:1(假设删除了1条)
注意:delete()会返回一个元组(删除的记录数, 各模型类型的删除数),通常只需关注第一个值。
三、常见问题与注意事项¶
- QuerySet是“惰性”的:只有在需要实际数据时(如遍历、调用count())才会执行查询,例如:
users = User.objects.filter(age=20) # 此时未执行SQL
print(users) # 此时才执行查询,返回结果
- 避免重复数据:若字段设置
unique=True(如示例中的email),插入重复数据会抛出IntegrityError,需提前检查:
if User.objects.filter(email="zhangsan@example.com").exists():
print("邮箱已存在")
else:
User.objects.create(...)
- get()的异常处理:
get()若未找到记录会抛出DoesNotExist异常,找到多条会抛出MultipleObjectsReturned异常,建议用try-except捕获:
try:
user = User.objects.get(id=999)
except User.DoesNotExist:
print("用户不存在")
四、总结¶
通过Django ORM,我们可以用Python对象直接操作SQLite数据库,无需编写复杂SQL。核心步骤是:
1. 定义模型(models.py)→ 映射到数据库表
2. 执行makemigrations和migrate生成表结构
3. 通过模型的objects管理器执行CRUD操作
这种方式让代码更简洁、易维护,尤其适合初学者快速上手数据库操作。后续可结合Django视图(Views)和模板(Templates),将ORM查询结果渲染到网页中,完成完整的Web开发流程。