模型 Meta 选项

本文件解释了所有可能的 metadata options 你可以把你的模型放在里面 class Meta .

可用的 Meta 选项

abstract

Options.abstract

如果 abstract = True ,此模型将是 abstract base class .

app_label

Options.app_label

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

app_label = "myapp"

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

base_manager_name

Options.base_manager_name

例如,管理器的属性名, 'objects' ,用于模型的 _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 .

要重写数据库表名,请使用 db_table 参数在 class Meta .

如果数据库表名是一个SQL保留字,或者包含在python变量名中不允许使用的字符(特别是连字符),那么就可以了。Django在后台引用列和表名。

对MariaDB和MySQL使用小写表名

强烈建议在通过重写表名时使用小写表名 db_table 尤其是在使用mysql后端的情况下。见 MySQL notes 了解更多详细信息。

Oracle的表名引用

为了满足Oracle对表名的30个字符限制,并与Oracle数据库的常规惯例相匹配,Django可以缩短表名并将其全部大写。要防止此类转换,请使用带引号的名称作为 db_table ::

db_table = '"name_left_in_lowercase"'

这些带引号的名称也可以与Django支持的其他数据库后端一起使用;但是,除了Oracle之外,这些引号没有任何效果。见 Oracle notes 了解更多详细信息。

db_table_comment

Options.db_table_comment

用于此模型的数据库表上的注释。对于那些可能没有查看Django代码的具有直接数据库访问权限的个人来说,它对于记录数据库表很有用。例如::

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

    class Meta:
        db_table_comment = "Question answers"

db_tablespace

Options.db_tablespace

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

default_manager_name

Options.default_manager_name

用于模型的管理器的名称 _default_manager .

get_latest_by

Options.get_latest_by

模型中字段或字段名称列表的名称,通常 DateFieldDateTimeFieldIntegerField . 这将指定要在模型中使用的默认字段 Managerlatest()earliest() 方法。

例子::

# Latest by ascending order_date.
get_latest_by = "order_date"

# Latest by priority descending, order_date ascending.
get_latest_by = ["-priority", "order_date"]

latest() 更多的文档。

managed

Options.managed

默认为 True ,这意味着Django将在 migrate 或者作为迁移的一部分,将它们作为 flush 管理命令。也就是说,Django 管理 数据库表的生命周期。

如果 False ,则不会对此模型执行任何数据库表创建、修改或删除操作。如果模型表示通过其他方法创建的现有表或数据库视图,则这很有用。这是 only 差异时 managed=False . 模型处理的所有其他方面与正常情况完全相同。这包括

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

  2. 如果模型与 managed=False 包含一个 ManyToManyField 它指向另一个非托管模型,那么也不会为多对多联接创建中间表。但是,一个托管模型和一个非托管模型之间的中间表 will 被创造。

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

用于涉及模型的测试 managed=False ,这取决于您确保在测试设置中创建正确的表。

如果您有兴趣更改模型类的python级行为,您可以 能够 使用 managed=False 并创建现有模型的副本。然而,对于这种情况,有一种更好的方法: 代理模型 .

order_with_respect_to

Options.order_with_respect_to

使此对象可以相对于给定字段排序,通常是 ForeignKey . 这可用于使相关对象相对于父对象可排序。例如,如果 Answer 涉及一个 Question 对象,一个问题有多个答案,答案的顺序很重要,您可以这样做:

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]

的顺序 Question 对象相关 Answer 对象可以通过传入一个 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 添加新的数据库列,如果添加或更改,请确保进行并应用适当的迁移。 order_with_respect_to 在你的首字母之后 migrate .

ordering

Options.ordering

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

ordering = ["-order_date"]

这是字符串和/或查询表达式的元组或列表。每个字符串都是一个字段名,前缀为可选的“-”表示降序。没有前导“-”的字段将按升序排列。使用字符串“?”随机订购。

例如,按 pub_date 字段升序,使用:

ordering = ["pub_date"]

订购 pub_date 降序,使用:

ordering = ["-pub_date"]

订购 pub_date 降序,然后按 author 升序,使用:

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

您也可以使用 query expressions . 订购 author 升序并使空值最后排序,使用此::

from django.db.models import F

ordering = [F("author").asc(nulls_last=True)]

警告

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

如果查询没有指定顺序,则从数据库中以未指定的顺序返回结果。只有当通过一组字段对结果中的每个对象进行唯一标识时,才能保证特定的排序。例如,如果 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', 'view') . 例如,如果您的应用程序不需要任何默认权限,您可以通过将此列表设置为空列表来自定义此列表。必须在模型上指定,然后才能由 migrate 以防止创建任何遗漏的权限。

proxy

Options.proxy

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

required_db_features

Options.required_db_features

当前连接应该具有的数据库功能列表,以便在迁移阶段考虑模型。例如,如果将此列表设置为 ['gis_enabled'] ,模型将只在支持GIS的数据库上同步。当使用几个数据库后端进行测试时,跳过一些模型也很有用。避免在ORM不处理此问题的情况下创建或不创建的模型之间建立关系。

required_db_vendor

Options.required_db_vendor

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

select_on_save

Options.select_on_save

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

通常不需要设置这个属性。默认值为 False .

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

indexes

Options.indexes

列表 indexes 您要在模型上定义的:

from django.db import models


class Customer(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            models.Index(fields=["last_name", "first_name"]),
            models.Index(fields=["first_name"], name="first_name_idx"),
        ]

unique_together

Options.unique_together

使用 UniqueConstraintconstraints 而不是选择。

UniqueConstraint 提供的功能比 unique_together . unique_together 将来可能会被弃用。

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

unique_together = [["driver", "restaurant"]]

这是一个列表,在一起考虑时必须是唯一的。它在django管理中使用,并在数据库级别(即适当的 UNIQUE 声明包含在 CREATE TABLE 声明)。

为了方便, unique_together 处理单个字段集时可以是单个列表:

unique_together = ["driver", "restaurant"]

A ManyToManyField 不能包含在 unique_together 。(甚至不清楚这意味着什么!)如果需要验证与 ManyToManyField ,请尝试使用信号或显式 through 模特。

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

constraints

Options.constraints

列表 constraints 您要在模型上定义的:

from django.db import models


class Customer(models.Model):
    age = models.IntegerField()

    class Meta:
        constraints = [
            models.CheckConstraint(check=models.Q(age__gte=18), name="age_gte_18"),
        ]

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

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

label_lower

Options.label_lower

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