安装与项目创建
- 安装 Django 的方式(pip 安装)
- 使用
django-admin startproject
创建新项目 - 项目目录结构解析(
settings.py
,urls.py
,wsgi.py
等)
启动开发服务器
- 使用
python manage.py runserver
启动本地开发环境 - 访问
http://127.0.0.1:8000/
确认 Django 运行状态 - 修改默认端口与 IP 绑定(
runserver 0.0.0.0:8080
)
创建应用(App)
- 使用
python manage.py startapp
创建新应用 - 在
settings.py
中注册应用(INSTALLED_APPS
) - 应用目录结构解析(
models.py
,views.py
,admin.py
等)
模型(Model)与数据库
- 定义模型类(继承
django.db.models.Model
) - 常用字段类型(
CharField
,IntegerField
,DateTimeField
等) - 执行数据库迁移(
makemigrations
和migrate
) - 使用 Django Shell 进行数据操作(
python manage.py shell
)
视图(View)与 URL 路由
- 编写视图函数(基于
HttpResponse
或render
) - 配置 URL 路由(
urls.py
中的path
或re_path
) - 类视图(
View
,ListView
,DetailView
)的基本使用
模板(Template)系统
- 模板文件存放位置(
templates/
目录) - 基本模板语法(变量
{ { var }}
, 标签{% tag %}
) - 模板继承(
{% extends %}
和{% block %}
)
Django Admin 后台管理
- 创建超级用户(
python manage.py createsuperuser
) - 注册模型到 Admin 后台(
admin.site.register(ModelName)
) - 自定义 Admin 界面(
ModelAdmin
类)
表单(Form)处理
- 使用 Django 表单类(
forms.Form
或forms.ModelForm
) - 表单渲染与验证(
is_valid()
方法) - CSRF 保护机制(
{% csrf_token %}
)
静态文件管理
- 配置
STATIC_URL
和STATICFILES_DIRS
- 使用
{% static %}
标签加载静态文件(CSS/JS/图片) - 生产环境静态文件收集(
collectstatic
命令)
部署基础
- 常见部署方式(Gunicorn + Nginx, Docker)
- 配置
ALLOWED_HOSTS
和DEBUG
模式 - 数据库配置(PostgreSQL/MySQL 替代 SQLite)
常见问题与调试
- 使用 Django Debug Toolbar 进行性能分析
- 日志配置(
LOGGING
设置) - 处理常见错误(
NoReverseMatch
,FieldError
等)
数据表之间的关系类型
数据表之间的关系主要分为三种基本类型,这些关系在关系型数据库中非常常见。
1. 一对一关系(One-to-One Relationship)
- 一个表中的每条记录只对应另一个表中的一条记录。
- 示例:员工表和社保号表,每个员工只有一个社保号,反之亦然。
- 实现方式:通常通过外键约束实现,且外键需设置为唯一(UNIQUE)。
2. 一对多关系(One-to-Many Relationship)
- 一个表中的一条记录可以对应另一个表中的多条记录。
- 示例:部门表和员工表,一个部门可以有多个员工,但一个员工只能属于一个部门。
- 实现方式:在“多”的一方(员工表)添加指向“一”的一方(部门表)的外键。
3. 多对多关系(Many-to-Many Relationship)
- 一个表中的多条记录可以关联另一个表中的多条记录。
- 示例:学生表和课程表,一个学生可以选修多门课程,一门课程也可以被多个学生选修。
- 实现方式:通过中间表(关联表)实现,中间表包含两个外键分别指向两个主表的主键。
其他衍生关系
自引用关系(Self-Referencing Relationship)
- 同一张表内的记录之间存在关联。
- 示例:员工表中的经理和下属关系,经理和下属均为员工表中的记录。
- 实现方式:在表中添加一个指向自身主键的外键字段。
零或一关系(Zero-or-One Relationship)
- 一种特殊的一对一关系,其中关联是可选的。
- 示例:用户表和会员表,某些用户可能是会员(关联一条记录),而其他用户可能不是(无关联)。
关键特点总结
- 关系的选择需根据业务逻辑设计,避免数据冗余或不一致。
- 外键约束可确保数据完整性,但可能影响性能,需权衡使用。
- 多对多关系必须通过中间表实现,不可直接关联。
- 一对一(0neTo0neField):通过外键唯一约束实现,通常用于拆分大表或存储敏感数据。
- 一对多(ForeignKey):最常见的关系,通过外键在“多”的一方指向“一”的一方。
- 多对多(ManyToManyField):需要中间表存储两个表的外键组合。
- 自引用:外键指向同一表的主键,用于层级数据(如组织结构)。
- 多态关联:灵活性高,但可能牺牲外键约束的完整性。
Django 查询方法
在Django中,查询方法主要通过ORM(对象关系映射)实现,用于操作数据库。
基础查询方法
all()
: 返回模型的所有对象,生成一个QuerySet
。
Model.objects.all()
filter(**kwargs)
: 返回满足条件的对象,支持链式调用。
Model.objects.filter(name='example')
exclude(**kwargs)
: 排除满足条件的对象。
Model.objects.exclude(age__lt=18)
get(**kwargs)
: 返回单个对象,如果未找到或找到多个会抛出异常。
Model.objects.get(id=1)
first()
: 返回QuerySet
中的第一个对象。
Model.objects.filter(active=True).first()
last()
: 返回QuerySet
中的最后一个对象。
Model.objects.filter(active=True).last()
字段查询
values(*fields)
: 返回包含指定字段的字典列表。
Model.objects.values('name', 'age')
values_list(*fields, flat=False)
: 返回包含指定字段的元组列表。如果flat=True
且只有一个字段,返回扁平化列表。
Model.objects.values_list('name', flat=True)
only(*fields)
: 仅加载指定字段,延迟加载其他字段。
Model.objects.only('name', 'email')
defer(*fields)
: 延迟加载指定字段。
Model.objects.defer('description')
排序和切片
order_by(*fields)
: 按指定字段排序,支持-
表示降序。
Model.objects.order_by('-created_at', 'name')
reverse()
: 反转QuerySet
的顺序。
Model.objects.order_by('name').reverse()
distinct(*fields)
: 去除重复记录。
Model.objects.distinct('name')
none()
: 返回空的QuerySet
。
Model.objects.none()
高级查询
select_related(*fields)
: 执行 SQL JOIN 操作,优化一对一或多对一关系的查询。
Model.objects.select_related('related_model')
prefetch_related(*fields)
: 预取多对多或反向关系的对象。