第四站:ORM、关系与事务
本站让查询的成本和写入的一致性变得可见。目标不是少写 SQL,而是知道 ORM 最终让数据库做了什么。
可运行检查
bash
python manage.py shell
python manage.py test tickets在 shell 中打印 Ticket.objects.filter(status="open").query,再学习QuerySet、关系与并发事务和执行计划、批量与查询预算。
交付物
- 列表一次取回负责人,查询数不会随行数线性增长。
- “认领工单”在目标数据库上使用事务与行锁。
- 提交后副作用通过
transaction.on_commit()触发。 - 并发失败有明确返回或有限重试,不静默覆盖。
深水边界
QuerySet 惰性会把查询推迟到迭代、序列化或模板。atomic() 保证数据库事务,不会自动撤销邮件和外部 HTTP。SQLite 的 select_for_update() 不能代表 PostgreSQL/MySQL 的锁行为。
练习(无答案展开)
- 查询每位用户的未关闭工单数,并说明结果粒度。
- 修复列表页的负责人 N+1。
- 实现并测试两个请求竞争同一工单时只有一个成功。