Django ORM 快速入门指南
什么是ORM?
- Object-Relational Mapping(对象关系映射)
- 把数据库表映射为Python类,字段映射为类属性
- 开发者可以用Python操作数据库,无需编写SQL语句
- 支持多种数据库:MySQL/PostgreSQL/SQLite等
快速开始
1. 定义模型
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author', on_delete=models.CASCADE)
publish_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
stock = models.IntegerField(default=0)
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
常用字段类型
字段类型 |
说明 |
CharField |
字符串字段 |
TextField |
长文本字段 |
IntegerField |
整数字段 |
BooleanField |
布尔字段 |
DateField/DateTimeField |
日期/日期时间字段 |
ForeignKey |
外键关联 |
字段参数
max_length
:最大长度
default
:默认值
unique
:唯一约束
null
:允许数据库存储NULL
blank
:允许表单验证为空
verbose_name
:可读名称
数据库迁移
python manage.py makemigrations
python manage.py migrate
基本CRUD操作
创建记录
book = Book(title='Django入门', price=49.99)
book.save()
Book.objects.create(title='Python进阶', price=59.99)
查询记录
all_books = Book.objects.all()
book = Book.objects.get(id=1)
cheap_books = Book.objects.filter(price__lt=50)
recent_books = Book.objects.filter(publish_date__year=2023)
non_free = Book.objects.exclude(price=0)
result = Book.objects.filter(price__gt=30).exclude(stock=0)
更新记录
book = Book.objects.get(id=1)
book.price = 55.99
book.save()
Book.objects.filter(stock=0).update(stock=100)
删除记录
book = Book.objects.get(id=1)
book.delete()
Book.objects.filter(price__gt=100).delete()
进阶查询
查询运算符
exact
:精确匹配
iexact
:不区分大小写的精确匹配
contains
/icontains
:包含查询
in
:在列表中
gt
/gte
/lt
/lte
:比较运算
startswith
/endswith
:开头/结尾匹配
聚合查询
from django.db.models import Avg, Max, Min, Sum
Book.objects.aggregate(
Avg('price'),
Max('price'),
Min('price')
)
Q对象(复杂查询)
from django.db.models import Q
Book.objects.filter(Q(price__lt=50) | Q(title__contains='Django'))
Book.objects.filter(Q(price__gt=30) & Q(stock__gt=0))
F表达式(字段比较)
from django.db.models import F
Book.objects.filter(price__gt=F('cost_price'))
Book.objects.update(stock=F('stock') + 10)
关联关系
1. 一对多(ForeignKey)
class Publisher(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
publisher = Publisher.objects.get(name="人民邮电出版社")
publisher.book_set.all()
2. 多对多(ManyToManyField)
class Author(models.Model):
books = models.ManyToManyField(Book)
author = Author.objects.get(name="张三")
author.books.add(book1, book2)
3. 一对一(OneToOneField)
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone = models.CharField(max_length=20)
事务处理
from django.db import transaction
with transaction.atomic():
book.stock -= 1
book.save()
管理后台集成
from django.contrib import admin
from .models import Book
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'price')
search_fields = ('title', 'author__name')
最佳实践
- 总是为外键设置
on_delete
规则
- 生产环境不要用SQLite
- 复杂查询优先考虑索引优化
- 批量操作使用
bulk_create
/update
- 使用
select_related
和prefetch_related
优化关联查询
常见问题
查询返回空?
- 检查filter条件是否正确
- 使用
exists()
检查是否存在记录
- 确认是否执行了migrations
性能问题?
- 使用
explain()
分析查询计划
- 避免在循环中执行数据库查询
- 使用缓存机制