2.ORM 数据操作
一、 多级路由转发
1. Django 的路由分发
from django.urls import path, include
from app import urls
urlpatterns = [
# 以 app 开头的路径,全部交给 app 处理
path('1级路由', include(urls))
]
二、 数据库模型 --- ORM
Object Relational Mapping
对象关系映射
ORM 的优势 : 利用编程语言方便操作数据库,无需掌握复杂的 sql 语句
1. ORM 用法
- 数据模型定义在 APP 目录下的
models.py
中 - 模型类继承 Django 的
models.Model
模型基本类 - 类名对应表名称,实际是小写应用名_小写模型类名
- 类成员对应数据的字段类型
2. 数据库常用字段类型
常用字段
CharField
: 字符串类型, 必须接收一个 max_length 参数
, 表示字符串最大长度 BooleanField
: 布尔值类型, 默认为 None DateTimeField
: 日期时间类型, python 的 datetime.datetime 实例 IntegerField
: 整数类型,范围 -2,147,483,648 到 2,147,483,647 。
字段 参数
null
: 如果是 True,Django 将在数据库中存储空值 NULL, 默认为 False default
: 默认值。可以是一个值,也可以是一个可调用的对象,不能是一个可更改的对象 unique
: 如果设置为 true,这个字段在整个表中保持值唯一。 默认为 False。若为 True 该字段可以成为一个唯一索引 verbose_name
: 字段备注名。如果没有给定详细名称,Django 会使用字段的属性名自动创建,下划线转换为空格 primary_key
: 如果设置为 True,将该字段设置为该模型的主键,最多只有一个字段被设置,如果没有设置,Django 会自带创建一个名为 ID 的字段作为主键
三、 数据库的激活与迁移
1. 数据模型配置
settings.py
设置对应的数据库连接信息- 如果用默认的 sqlite 作为开发数据库可以不用设置
settings.py
关联对应数据所在的 app- 即 为应用注册
2. 数据迁移命令
提示
修改数据库后,需要运行这两个命令同步数据库
- 生成模型迁移文件(此时不操作数据库)
python manage.py makemigrations
- 同步到数据库(此时操作数据库)
python manage.py migrate
四、 数据库 API 操作
1. Django 自动命令行
python manage.py shell
或者
django-admin shell # python mange.py 相当于 django-admin
2. 模型管理器(Manager)
模型管理器 : 管理当前数据模型对应表的 增删改查 操作 只能通过类调用,不能通过实例调用
如 Event.objects
而不是 Event().objects
使用模型管理器 增 查
Event.objects.create(name="发布会", address="软件大道",)
Event.objects.all()
3. 增、删、改、查
Model.objects.create(**kw)
modelObj.delete()
new_modelObj.save()
Model.objects.filiter(**kw)
- 查询所有 select * from 表名
Model.objects.all()
: 返回 QuerySet 对象
- 过滤查询条件 select * from 表名 where xxx
Model.objects.filter(**kw)
: 返回 QuerySet 对象Model.objects.values(**kw)
: 返回 QuerySet 对象(内容时数据键值对)
- 查询单个 select * from 表名 where xxx limits=1
Model.objects.get(**kw)
: 返回单个模型数据对象,如果结果超过或者少于 1 个抛出异常
- 快捷操作查
get_object_or_404(模型类,**kw)
**KW
: 表示查询参数,对应数据库字段名:值
五、 Django 自带 admin 后台
1. 注册 超级用户
python manage.py createsuperuser
页面地址:
http://127.0.0.1:8000/admin/
2. 后台数据关联数据模型
在 admin.py
文件中修改
from sgin import models
admin.site.register(models.Event)
3. 修改显示信息
在 models.py
文件中修改
def __str__(self):
return self.name
4. 通过 数据库表的主键(id)来实现页面跳转
from django.urls import path
from sgin import views
urlpatterns = [
path('events/', views.events),
path('event_detail/<int:event_id>', views.event_detail),
]
def events(request):
# 从数据库查询所有发布会信息
event_list = Event.objects.all()
return render(request, "sgin/events.html", {'event_list':event_list})
# 发布会详情
def event_detail(request, event_id):
# 根据 event_id 查询对应的发布会数据
# pk:主键 默认数据表中的主键名为id
event = Event.objects.get(pk=event_id)
return render(request, "sgin/event_detail.html", {"event":event})
{% extends "sgin/base.html" %} {% block content %}
<ul class="list-group">
{% for event in event_list %}
<li class="list-group-item text-center">
<a href="/sgin/event_detail/{{ event.id }}">{{ event }}</a>
</li>
{% endfor %}
</ul>
{% endblock %}
六、 数据库表关联
1. 外键的定义方式(多对 1)
models.ForeignKey(目标模型类, on_delete=models.CASCADE)
此外键定义在多对一方
on_delete 可选项
CASCADE
: 模拟 SQL 语音中的 ON DELETE CASCADE 约束,将定义有违建的模型对象同时删除PROTECT
: 组织上面的删除操作,但是弹出 ProtectedError 异常SET_NULL
: 将外键字段设置为 null, 只有当字段设置了 null=True 时,方可使用该值SET_DEFAULT
: 将外键字段设置为默认值。只有当字段设置了 default 参数时,方可使用DO_NOTHING
: 什么也不做SET()
: 自定义值,参数可以为常量或者回调函数的返回值
# 关联发布会
event = models.ForeignKey(Event, on_delete=models.DO_NOTHING, verbose_name="关联发布会")
2. 外键的定义方式(多对多)
modelsManyToManyField(目标模型类)
只可以在一方定义,不可以两方同时定义