Django - ORM 数据操作

一、 多级路由转发

1. Django 的路由分发

1
2
3
4
5
6
7
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. 数据库常用字段类型

Django 字段参考

常用字段

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. 数据迁移命令

::: tip

修改数据库后,需要运行这两个命令同步数据库

:::

  • 生成模型迁移文件(此时不操作数据库)

    1
    python manage.py makemigrations
  • 同步到数据库(此时操作数据库)

    1
    python manage.py migrate

四、 数据库 API 操作

1. Django 自动命令行

1
2
3
4
5
python manage.py shell

或者

django-admin shell # python mange.py 相当于 django-admin

2. 模型管理器(Manager)

模型管理器 : 管理当前数据模型对应表的 增删改查 操作

只能通过类调用,不能通过实例调用

Event.objects 而不是 Event().objects

使用模型管理器 增 查

1
2
3


Event.objects.create(name="发布会", address="软件大道",)
1
2
3


Event.objects.all()

3. 增、删、改、查

1. 增

1
Model.objects.create(**kw)

2. 删

1
modelObj.delete()

3. 改

1
new_modelObj.save()

4. 查

1
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. 注册 超级用户

1
python manage.py createsuperuser

页面地址:

http://127.0.0.1:8000/admin/

2. 后台数据关联数据模型

admin.py 文件中修改

1
2
3
from sgin import models

admin.site.register(models.Event)


3. 修改显示信息

models.py 文件中修改

1
2
def __str__(self):
return self.name


4. 通过 数据库表的主键(id)来实现页面跳转


1
2
3
4
5
6
7
from django.urls import path
from sgin import views

urlpatterns = [
path('events/', views.events),
path('event_detail/<int:event_id>', views.event_detail),
]

</code-block>


1
2
3
4
5
6
7
8
9
10
11
12
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})

</code-block>

1
2
3
4
5
6
7
8
9
{% 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 %}

</code-block>

</code-group>

六、 数据库表关联

1. 外键的定义方式(多对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() : 自定义值,参数可以为常量或者回调函数的返回值
1
2
# 关联发布会
event = models.ForeignKey(Event, on_delete=models.DO_NOTHING, verbose_name="关联发布会")

2. 外键的定义方式(多对多)

1
modelsManyToManyField(目标模型类)

只可以在一方定义,不可以两方同时定义