目录
0x00 – 概述
模型准确且唯一的描述了数据。
它包含您储存的数据的重要字段和行为。
一般来说,每一个模型都映射一张数据库表。
- 每一个模型都是一个 python 的类,这些类继承 django.db.models.Model
- 模型类的每一个属性都相当于一个数据库的字段。
0x01 – 快速上手
模型都是在你的应用中的 model.py 文件内进行编辑的:
from django.db import models # 从django.db 倒入 models 模块
class Person(models.Model): # 创建一个 Person 类,它将映射为一张数据表
first_name = models.CharField(max_length=30) # 一个数据库字段 first_name
last_name = models.CharField(max_length=30) # 一个数据库字段 last_name
数据库表名称会自动从模型元数据中派生出来:myapp_person
除了上述两个字段,在这张表内会有一个 id 字段会被自动添加,但是这种行为可以被改写。
0x02 – 使用模型
定义模型后,需要告诉 Django 你要使用这些模型:
在 settings.py 文件内设置如下:
INSTALLED_APPS = [
'myapp', # 这里格式为: myapp.apps.MyappConfig
... # 点方法分隔,m(M)yapp 替换为你的APP名
]
当向 INSTALL_APPS 添加新的应用时,无比运行以下两个命令:
$ python manage.py makemigrations # 为模型的改变生成迁移文件
$ python manage.py migrate # 应用数据库迁移
0x03 – 字段
模型中最重要且唯一必要的是数据库的字段定义。字段在类属性中定义。
字段部分比较重要,内容较多,单独编辑,具体有以下几个部分:
0x04 – Meta 选项
使用内部 Meta 类来给模型赋予元数据。
模型元数据:即所有不是字段的东西。(如:排序项(ordering)、数据表名(db_table)等)
模型当中的Meta 类完全是可选的。
from django.db import models
class Ox(models.Model):
horn_length = models.IntegerField()
class Meta: # Meta 类,完全是可选的
ordering = ["horn_length"] # 排序项
verbose_name_plural = "oxen" # 复数形式的备注名称
0x05 – 模型属性
模型当中最重要的属性是 Manager。
它是 Django 模型和数据库查询操作之间的接口,并且它被用作从数据库当中 获取实例,如果没有指定自定义的 Manager 默认名称是 objects。
Manager 只能通过模型类来访问,不能通过模型实例来访问。
0x06 – 模型方法
在模型中添加自定义方法会给你的对象提供自定义的“行级”操作能力。
与之对应的是类 Manager 的方法意在提供“表级”的操作,模型方法应该在某个对象实例上生效。
这是一个将相关逻辑代码放在一个地方的技巧——模型。
0x07 – 模型继承
模型继承在 Django 中与普通类继承在 Python 中的工作方式几乎完全相同,其基类应该继承自 django.db.models.Model。
你只需要决定父类模型是否需要拥有它们的权利(拥有它们的数据表),或者父类仅作为承载仅子类中可见的公共信息的载体。
Django 有三种可用的集成风格:
- 常见情况下,你仅将父类用于子类公共信息的载体,因为你不会想在每个子类中把这些代码都敲一遍。这样的父类永远都不会单独使用,所以 抽象基类 是你需要的。
- 若你继承了一个模型(可能来源其它应用),且想要每个模型都有对应的数据表,要使用多表继承。
- 若你只想修改模型的 Python 级行为,而不是以任何形式修改模型字段, 需要使用代理模型。
0x08 – 在一个包中管理模型
manage.py startapp
命令创建了一个应用结构,包含一个 models.py 文件。若你有很多 models.py 文件,用独立的文件管理它们会很实用。
为了达到此目的,创建一个 models 包。删除 models.py,创建一个 myapp/models 目录,包含一个 init.py 文件和存储模型的文件。你必须在 init.py 文件中导入这些模块。
比如,若你在 models 目录下有 organic.py 和 synthetic.py:
# myapp/models/__init__.py
from .organic import Person
from .synthetic import Robot
显式导入每个模块,而不是使用 from .models import *
有助于不打乱命名空间,使代码更具可读性,让代码分析工具更有用。
2021年9月16日
更新于2021年9月24日