Skip to main content

模型 Meta 选项

本文解释所有可能的 元数据选项,您可以在其内部 class Meta 给您的模型。

可用的 Meta 选项

abstract

Options.abstract

如果 abstract = True,这个模型将是一个 抽象基类

app_label

Options.app_label

如果模型在 INSTALLED_APPS 中的应用程序之外定义,它必须声明它属于哪个应用程序:

app_label = 'myapp'
New in Django 1.9.

如果要使用格式 app_label.object_nameapp_label.model_name 表示模型,您可以分别使用 model._meta.labelmodel._meta.label_lower

base_manager_name

Options.base_manager_name
New in Django 1.10.

用于模型的 _base_manager 的经理的名称。

db_table

Options.db_table

要用于模型的数据库表的名称:

db_table = 'music_album'

表名

为了节省时间,Django从模型类的名称和包含它的应用程序的名称中自动导出数据库表的名称。模型的数据库表名是通过将模型的“app label”(在 manage.py startapp 中使用的名称)连接到模型的类名,并在它们之间加下划线来构建的。

例如,如果您有一个应用程序 bookstore (由 manage.py startapp bookstore 创建),定义为 class Book 的模型将具有一个名为 bookstore_book 的数据库表。

要覆盖数据库表名,请使用 class Meta 中的 db_table 参数。

如果您的数据库表名称是SQL保留字,或包含Python变量名中不允许的字符,特别是连字符 - 没关系。 Django在后台引用列和表名。

对MySQL使用小写的表名

强烈建议您在通过 db_table 覆盖表名时使用小写表名,尤其是在使用MySQL后端时。有关详细信息,请参阅 MySQL注释

Oracle的表名引用

为了满足Oracle对表名称的30个字符限制,并且符合Oracle数据库的通常约定,Django可以缩短表名称并将其转换为全大写。要防止此类转换,请使用带引号的名称作为 db_table 的值:

db_table = '"name_left_in_lowercase"'

这样的引用名称也可以与Django的其他支持的数据库后端一起使用;除了Oracle,但是,引号没有效果。有关详细信息,请参阅 Oracle注释

db_tablespace

Options.db_tablespace

用于此模型的 数据库表空间 的名称。默认值是项目的 DEFAULT_TABLESPACE 设置(如果设置)。如果后端不支持表空间,则忽略此选项。

default_manager_name

Options.default_manager_name
New in Django 1.10.

用于模型的 _default_manager 的经理的名称。

get_latest_by

Options.get_latest_by

模型中可排序字段的名称,通常为 DateFieldDateTimeFieldIntegerField。这指定了在 Managerlatest()earliest() 方法中使用的默认字段。

例:

get_latest_by = "order_date"

有关更多信息,请参阅 latest() 文档。

managed

Options.managed

默认为 True,意味着Django将在 migrate 中创建相应的数据库表或作为迁移的一部分,并将它们作为 flush 管理命令的一部分删除。也就是说,Django manages 是数据库表的生命周期。

如果是 False,则不会为此模型执行数据库表创建或删除操作。如果模型表示已由某些其他方法创建的现有表或数据库视图,这将非常有用。这是 managed=Falseonly 差异。模型处理的所有其他方面与正常完全相同。这包括

  1. 如果不声明它,请向模型中添加自动主键字段。为了避免对以后的代码阅读器造成混淆,建议在使用非托管模型时指定要建模的数据库表中的所有列。

  2. 如果具有 managed=False 的模型包含指向另一个非托管模型的 ManyToManyField,则也不会创建多对多连接的中间表。但是,将创建一个托管模型和一个非托管模型 will 之间的中间表。

    如果需要更改此默认行为,请将中间表创建为显式模型(根据需要设置 managed),并使用 ManyToManyField.through 属性使关系使用您的自定义模型。

对于涉及具有 managed=False 的模型的测试,由您确保在测试设置中创建正确的表。

如果你有兴趣改变模型类的Python级别行为,could 使用 managed=False 并创建一个现有模型的副本。然而,对于这种情况有一个更好的方法:代理模型

order_with_respect_to

Options.order_with_respect_to

使此对象相对于给定字段可排序,通常为 ForeignKey。这可以用于使相关对象相对于父对象可排序。例如,如果 AnswerQuestion 对象相关,并且问题具有多个答案,并且答案的顺序很重要,则可以执行此操作:

from django.db import models

class Question(models.Model):
    text = models.TextField()
    # ...

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    # ...

    class Meta:
        order_with_respect_to = 'question'

当设置 order_with_respect_to 时,提供两个附加方法来检索和设置相关对象的顺序:get_RELATED_order()set_RELATED_order(),其中 RELATED 是低级模型名称。例如,假设 Question 对象具有多个相关的 Answer 对象,返回的列表包含相关 Answer 对象的主键:

>>> question = Question.objects.get(id=1)
>>> question.get_answer_order()
[1, 2, 3]

可以通过传递 Answer 主键的列表来设置 Question 对象的相关 Answer 对象的顺序:

>>> question.set_answer_order([3, 1, 2])

相关对象也获得两个方法,get_next_in_order()get_previous_in_order(),它们可以用于以它们正确的顺序访问那些对象。假设 Answer 对象是由 id 排序的:

>>> answer = Answer.objects.get(id=2)
>>> answer.get_next_in_order()
<Answer: 3>
>>> answer.get_previous_in_order()
<Answer: 1>

order_with_respect_to 隐式设置 ordering 选项

在内部,order_with_respect_to 添加一个名为 _order 的附加字段/数据库列,并将模型的 ordering 选项设置为此字段。因此,order_with_respect_toordering 不能一起使用,并且每当您获得此模型的对象列表时,将应用 order_with_respect_to 添加的排序。

更改 order_with_respect_to

因为 order_with_respect_to 添加了一个新的数据库列,所以如果在初始 migrate 之后添加或更改 order_with_respect_to,请确保创建并应用适当的迁移。

ordering

Options.ordering

对象的默认排序,用于获取对象列表时:

ordering = ['-order_date']

这是一个元组或字符串列表。每个字符串是一个带有可选“ - ”前缀的字段名称,表示降序。没有前导“ - ”的字段将按升序排序。使用字符串“?”随机排序。

例如,要按照 pub_date 字段升序排序,请使用此:

ordering = ['pub_date']

要通过 pub_date 降序排序,请使用此:

ordering = ['-pub_date']

要通过 pub_date 降序,然后按 author 升序,使用此:

ordering = ['-pub_date', 'author']

默认排序也会影响 聚合查询

警告

订购不是免费操作。添加到排序中的每个字段都会对数据库产生成本。您添加的每个外键也将隐含地包括其所有默认排序。

如果查询未指定排序,则以未指定的顺序从数据库返回结果。只有当通过唯一地标识结果中的每个对象的一组字段进行排序时,才保证特定的排序。例如,如果 name 字段不是唯一的,则它的排序不会保证具有相同名称的对象总是以相同的顺序出现。

permissions

Options.permissions

创建此对象时,输入权限表的额外权限。将自动为每个模型创建添加,删除和更改权限。此示例指定了一个额外的权限,can_deliver_pizzas:

permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)

这是一个2元组的列表或元组,格式为 (permission_code, human_readable_permission_name)

default_permissions

Options.default_permissions

默认为 ('add', 'change', 'delete')。您可以自定义此列表,例如,如果您的应用程序不需要任何默认权限,请将此列表设置为空列表。必须在 migrate 创建模型之前在模型上指定它,以防止创建任何省略的权限。

proxy

Options.proxy

如果 proxy = True,将另一个模型子类化的模型将被视为 代理模型

required_db_features

Options.required_db_features
New in Django 1.9.

当前连接应具有的数据库功能列表,以便在迁移阶段考虑模型。例如,如果将此列表设置为 ['gis_enabled'],则模型将仅在启用了GIS的数据库上同步。在使用多个数据库后端进行测试时,跳过某些模型也很有用。避免可能或可能不会创建的模型之间的关系,因为ORM不处理此问题。

required_db_vendor

Options.required_db_vendor
New in Django 1.9.

此模型特定的受支持的数据库供应商的名称。当前内置的供应商名称是:sqlitepostgresqlmysqloracle。如果此属性不为空,并且当前连接供应商与其不匹配,则不会同步模型。

select_on_save

Options.select_on_save

确定Django是否将使用1.6之前的 django.db.models.Model.save() 算法。旧算法使用 SELECT 来确定是否存在要更新的现有行。新算法直接尝试 UPDATE。在一些罕见的情况下,现有行的 UPDATE 对Django不可见。一个例子是返回 NULL 的PostgreSQL ON UPDATE 触发器。在这种情况下,即使数据库中存在一行,新算法也会结束 INSERT

通常不需要设置此属性。默认值为 False

有关旧的和新的保存算法的更多信息,请参阅 django.db.models.Model.save()

unique_together

Options.unique_together

合在一起的字段名称的集合必须是唯一的:

unique_together = (("driver", "restaurant"),)

这是一个元组的元组,在一起考虑时必须是唯一的。它在Django管理器中使用,并在数据库级别执行(即,相应的 UNIQUE 语句包括在 CREATE TABLE 语句中)。

为了方便起见,当处理单个字段集合时,unique_together可以是单个元组:

unique_together = ("driver", "restaurant")

ManyToManyField 不能包含在unique_together中。 (不清楚这是什么意思!)如果您需要验证与 ManyToManyField 相关的唯一性,请尝试使用信号或显式 through 模型。

在违反约束的模型验证期间引发的 ValidationError 具有 unique_together 错误代码。

index_together

Options.index_together

组合在一起的字段名称的索引:

index_together = [
    ["pub_date", "deadline"],
]

此字段列表将一起编入索引(即将发出适当的 CREATE INDEX 声明。)

为了方便起见,当处理单个字段集时,index_together 可以是单个列表:

index_together = ["pub_date", "deadline"]

verbose_name

Options.verbose_name

对象的人类可读的名称,单数:

verbose_name = "pizza"

如果没有给出,Django将使用类名的绿色版本:CamelCase 变为 camel case

verbose_name_plural

Options.verbose_name_plural

对象的复数名称:

verbose_name_plural = "stories"

如果没有给出,Django将使用 verbose_name + "s"

只读 Meta 属性

label

Options.label
New in Django 1.9.

对象的表示,返回 app_label.object_name,例如。 'polls.Question'

label_lower

Options.label_lower
New in Django 1.9.

模型的表示,返回 app_label.model_name,例如。 'polls.question'