Django ORM(Object-Relational Mapping,对象关系映射)允许你用Python代码来操作数据库——创建、查询、更新和删除数据。
1. 创建模型
首先,你需要定义一个模型(Model),它是一个Python类,继承自 django.db.models.Model
。模型中的每个属性通常对应数据库中的一个字段。
# app01/models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=32) # 书籍名称
price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
publish = models.CharField(max_length=32) # 出版社名称
pub_date = models.DateField() # 出版时间
2. 更新 settings.py
确保你的应用(在这个例子中是 app01
)已经添加到项目的 settings.py
文件的 INSTALLED_APPS
配置中。
# settings.py
INSTALLED_APPS = (
# ...
'app01', # 添加这行
# ...
)
3. 数据库迁移
定义好模型后,需要执行迁移命令来创建数据库表。
python manage.py makemigrations app01 # 创建迁移文件
python manage.py migrate app01 # 应用迁移到数据库
4. 数据库添加
你可以使用Django ORM 来添加数据。有两种常见的方法:
- 实例化模型类并保存:
# app01/views.py
from .models import Book
def add_book(request):
book = Book(title="示例书籍", price=88.88, publish="示例出版社", pub_date="2024-01-01")
book.save() # 保存到数据库
# ...
- 使用
create()
方法(推荐方式):
from .models import Book
def add_book(request):
Book.objects.create(
title="示例书籍",
price=88.88,
publish="示例出版社",
pub_date="2024-01-01",
)
# ...
5. 数据查询
Django ORM 提供了多种查询方法:
- 查询所有记录:
books = Book.objects.all()
- 查询特定记录:
book = Book.objects.get(pk=1) # 根据主键查询
books = Book.objects.filter(title__contains="示例")
- 查询符合条件的记录数量:
count = Book.objects.count()
6. 数据更新
- 更新特定记录:
book = Book.objects.get(pk=1)
book.price = 99.99
book.save()
- 批量更新记录:
updated_count = Book.objects.filter(title__contains="示例").update(price=99.99)
7. 数据删除
- 删除特定记录:
book = Book.objects.get(pk=1)
book.delete()
- 批量删除记录:
deleted_count = Book.objects.filter(title__contains="示例").delete()
8. 常见查询方法
Django ORM 提供了丰富的查询表达式,例如:
__in
: 查询在给定列表中的值。__range
: 查询在指定范围内的值。__gt
: 大于。__gte
: 大于等于。__lt
: 小于。__lte
: 小于等于。__contains
: 包含子字符串。__icontains
: 不区分大小写地包含子字符串。__startswith
: 以指定字符串开始。__endswith
: 以指定字符串结束。
9. 排序和逆序
- 排序:
books = Book.objects.order_by('price') # 升序
books = Book.objects.order_by('-price') # 降序
- 逆序:
books = Book.objects.reverse()
10. 分页
Django ORM 也支持对查询结果进行分页。
from django.core.paginator import Paginator
books = Book.objects.all()
paginator = Paginator(books, 10) # 每页10条数据
page = paginator.get_page(1) # 获取第一页