0x01 -- Django -- 模型介绍 -- 1

本文深入介绍了Django模型的使用,包括模型的定义、字段类型与选项、Meta元数据、模型属性和方法、继承机制以及如何管理多个模型文件。模型是数据的蓝图,映射到数据库表,每个模型类都继承自`django.db.models.Model`。字段定义了数据库的列,Meta类允许自定义排序和表名。模型方法提供了对象级别的操作,而模型继承则支持不同类型的继承策略。文章还讨论了如何在包中组织多个模型文件。
摘要由CSDN通过智能技术生成


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 – 字段

模型中最重要且唯一必要的是数据库的字段定义。字段在类属性中定义。

字段部分比较重要,内容较多,单独编辑,具体有以下几个部分:

  1. 字段类型
  2. 字段选项
  3. 其他
    1. 自动设置主键
    2. 字段备注名
    3. 跨文件模型
    4. 字段命名限制
    5. 自定义字段类型
  4. 关联关系

0x04 – Meta 选项

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 有三种可用的集成风格:

  1. 常见情况下,你仅将父类用于子类公共信息的载体,因为你不会想在每个子类中把这些代码都敲一遍。这样的父类永远都不会单独使用,所以 抽象基类 是你需要的。
  2. 若你继承了一个模型(可能来源其它应用),且想要每个模型都有对应的数据表,要使用多表继承
  3. 若你只想修改模型的 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日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值