引言
Django作为Python最流行的Web框架之一,其ORM(对象关系映射)系统是开发高效数据库应用的核心工具。本文将通过图书管理系统的实战案例,带你从零掌握Django ORM的核心用法,涵盖模型设计、增删改查、高级查询、事务管理及后台管理系统的搭建,助你从入门到精通!
目录
一、Django ORM核心概念
1.1 什么是ORM?
ORM(Object Relational Mapping)即对象关系映射,通过将数据库表映射为Python类,字段映射为类属性,数据行映射为对象,开发者无需编写SQL即可操作数据库。优势包括:
-
简化开发:用Python语法替代SQL语句。
-
跨数据库兼容:轻松切换数据库(如MySQL、SQLite)。
-
安全性:自动处理SQL注入等风险。
1.2 Django的MVT模式
-
Model:定义数据结构和数据库交互。
-
View:处理业务逻辑,连接Model和Template。
-
Template:生成HTML页面,负责数据展示。
二、图书管理系统实战
2.1 项目搭建与配置
1. 创建Django项目与应用
django-admin startproject BookManager
cd BookManager
python manage.py startapp book
2. 配置MySQL数据库
在settings.py
中修改数据库配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'book_db',
'USER': 'root',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': '3306',
}
}
3. 安装PyMySQL驱动
pip install pymysql
在项目__init__.py
中添加:
import pymysql
pymysql.install_as_MySQLdb()
2.2 模型设计
定义出版社、书籍、作者模型:
# models.py
from django.db import models
class Press(models.Model):
name = models.CharField(max_length=32)
class Book(models.Model):
title = models.CharField(max_length=32)
press = models.ForeignKey(Press, on_delete=models.CASCADE)
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField(Book)
生成数据库表
python manage.py makemigrations
python manage.py migrate
2.3 实现增删改查(CRUD)
1. 出版社管理
视图函数示例:
# views.py
from django.shortcuts import render, redirect
from .models import Press
def press_list(request):
presses = Press.objects.all()
return render(request, 'press_list.html', {'presses': presses})
def add_press(request):
if request.method == 'POST':
name = request.POST.get('name')
Press.objects.create(name=name)
return redirect('/press_list/')
return render(request, 'add_press.html')
模板页面(部分):
<!-- press_list.html -->
<table border="1">
{% for press in presses %}
<tr>
<td>{{ press.id }}</td>
<td>{{ press.name }}</td>
<td><a href="/delete_press/?id={{ press.id }}">删除</a></td>
</tr>
{% endfor %}
</table>
2. 书籍与作者关联
多对多关系操作:
# 添加作者与书籍的关联
author_obj.books.add(book1, book2)
# 清空关联
author_obj.books.clear()
2.4 高级查询技巧
1. 双下划线跨表查询
# 查询“清华出版社”出版的所有书籍
books = Book.objects.filter(press__name='清华出版社')
2. 聚合与分组
from django.db.models import Avg
# 按出版社分组查询平均价格
Press.objects.annotate(avg_price=Avg('book__price')).values('name', 'avg_price')
3. F查询与Q查询
from django.db.models import F, Q
# 查询库存大于销量的书籍
Book.objects.filter(stock__gt=F('sold'))
# 组合条件查询(OR)
Book.objects.filter(Q(title__contains='Python') | Q(author__name='张三'))
三、Django Admin后台管理
3.1 创建超级用户
python manage.py createsuperuser
3.2 注册模型
在admin.py
中注册模型并自定义展示字段:
from django.contrib import admin
from .models import Press, Book
class PressAdmin(admin.ModelAdmin):
list_display = ['id', 'name']
admin.site.register(Press, PressAdmin)
admin.site.register(Book)
四、常见问题与优化
4.1 性能优化
-
惰性查询:
QuerySet
延迟执行,避免过早加载数据。 -
select_related:减少外键查询次数。
Book.objects.select_related('press').all()
4.2 事务处理
from django.db import transaction
with transaction.atomic():
# 原子操作
book = Book.objects.create(title='Django进阶')
author.books.add(book)
五、总结与资源
通过本文,你已掌握:
-
Django ORM的核心用法与模型设计。
-
图书管理系统的完整开发流程。
-
高级查询、事务及后台管理技巧。
推荐资源:
-
《Django企业开发实战》