在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()会返回一个元组(删除的记录数, 各模型类型的删除数),通常只需关注第一个值。

三、常见问题与注意事项

  1. QuerySet是“惰性”的:只有在需要实际数据时(如遍历、调用count())才会执行查询,例如:
   users = User.objects.filter(age=20)  # 此时未执行SQL
   print(users)  # 此时才执行查询,返回结果
  1. 避免重复数据:若字段设置unique=True(如示例中的email),插入重复数据会抛出IntegrityError,需提前检查:
   if User.objects.filter(email="zhangsan@example.com").exists():
       print("邮箱已存在")
   else:
       User.objects.create(...)
  1. 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. 执行makemigrationsmigrate生成表结构
3. 通过模型的objects管理器执行CRUD操作

这种方式让代码更简洁、易维护,尤其适合初学者快速上手数据库操作。后续可结合Django视图(Views)和模板(Templates),将ORM查询结果渲染到网页中,完成完整的Web开发流程。

小夜