0x00 – Meta 使用示例
使用内部 Meta(/ˈmedə/) 类来给模型赋予元数据。
模型元数据:即所有不是字段的东西。(如:排序项(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" # 复数形式的备注名称
0x01 – 可用的 Meta 选项
选项 | 意义 |
---|---|
abstract | 如果 abstract = True,这个模型将是一个 抽象基类。 |
app_label | 如果在 INSTALLED_APPS 中定义了一个应用程序之外的模型,它必须声明它属于哪个应用程序:app_label = 'myapp' 如果你想用 app_label.object_name 或 app_label.model_name 来表示一个模型,你可以分别使用 model._meta.label 或 model._meta.label_lower 。 |
base_manager_name | 管理器的属性名,例如,‘objects’,用于模型的 _base_manager。 |
db_table | 用于模型的数据库表的名称:db_table = 'music_album' 表名称 |
db_tablespace | 此模型要使用的 数据库表空间 名称。如果有设置的话,默认是项目的 DEFAULT_TABLESPACE 配置。如果后端不支持表空间,则忽略此选项。 |
default_manager_name | 模型的 _default_manager 管理器名称。 |
default_related_name | 从相关对象到这个对象的关系默认使用的名称。默认为 _set。官方文档 |
get_latest_by | 模型中的字段名或字段名列表,通常是 DateField,DateTimeField 或 IntegerField。 这指定了在你的模型中使用的默认字段 Manager 的 last() 和 earliest() 方法。 |
managed | 默认为 True,Django管理数据库表的生命周期 如果 False,将不对该模型进行数据库表的创建、修改或删除操作。官方文档 |
order_with_respect_to | 使该对象可以根据给定字段(通常是 ForeignKey )进行排序。这可以用来使相关对象相对于父对象可排序。官方文档 |
ordering | ❗️对象的默认排序,用于获取对象列表时官方文档 |
permissions | 创建此对象时要输入权限表的额外权限。为每个模型自动创建添加、更改、删除和查看权限。官方文档 |
default_permissions | 默认值为 (‘add’, ‘change’, ‘delete’, ‘view’) 。你可以自定义这个列表,例如,如果你的应用不需要任何默认的权限,可以将其设置为空列表。它必须在模型创建之前通过 migrate 在模型上指定,以防止任何遗漏的权限被创建。 |
proxy | 如果 proxy = True,作为另一个模型子类的模型将被视为 代理模型。 |
required_db_features | 当前连接应具备的数据库特征列表,以便在迁移阶段考虑模型。例如,如果你将此列表设置为 [‘gis_enabled’],则模型将只在支持 GIS 的数据库上同步。在使用多个数据库后端进行测试时,跳过一些模型也很有用。避免模型之间的关系,这些模型可能会被创建,也可能不会被创建,因为 ORM 不会处理这个问题。 |
required_db_vendor | 本模型所特有的支持的数据库厂商名称。目前的内置厂商名称是: sqlite,postgresql ,mysql和 oracle 。如果该属性不为空,且当前连接厂商与之不匹配,则该模型将不会同步。 |
select_on_save | 通常不需要设置这个属性。默认值是 False。确定 Django 是否会使用 1.6 之前的 django.db.models.Model.save() 算法。 |
indexes | 你想在模型上定义的 indexes 的列表官方文档 |
unique_together | 一组字段名,合起来必须是唯一的官方文档 |
index_together | 一组字段名,合在一起,是有索引的官方文档 |
constraints | 你想在模型上定义的 约束 列表官方文档 |
verbose_name | 对象的可读名称,单数:verbose_name = "pizza" 如果没有给定,Django 将使用一个 munged 版本的类名:CamelCase 变成 camel case。 |
verbose_name_plural | 对象的复数名称:verbose_name_plural = "stories" 如果没有给定,Django 将使用 verbose_name + “s”。 |
0x02 – 只读的 Meta 属性
- label:对象的表示,返回 app_label.object_name,例如 ‘polls.Question’。
- label_lower:模型的表示,返回 app_label.model_name,例如 ‘polls.question’。
表名称
为了节省你的时间,Django 会自动从你的模型类和包含它的应用程序的名称中导出数据库表的名称。一个模型的数据库表名是通过将模型的“app label”——你在 manage.py startapp 中使用的名称——与模型的类名连接起来,并在两者之间加上下划线。
例如,如果你有一个应用程序 bookstore (由 manage.py startapp bookstore 创建),一个定义为 class Book 的模型将有一个名为 bookstore_book 的数据库表。
要覆盖数据库表名,使用 class Meta 中的 db_table 参数。
如果你的数据库表名是 SQL 的保留字,或者包含 Python 变量名中不允许的字符——特别是连字符——那也没关系。Django 会在幕后引用列名和表名。
2021年9月22日