Django Meta

Available Meta options

abstract

如果为True,这个model就是抽象类

app_label

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

app_label = 'myapp'

base_manager_name

用于模型的_base_manager的管理器的名称。

db_table

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

db_table = 'music_album'

db_tablespace

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

default_manager_name

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

默认情况下,从相关对象返回到此对象的关系将使用的名称。默认值是<model_name>_set。也可以通过models.ForeignKey()的related_name参数设置。

get_latest_by

根据给定的字段返回表中的最新对象。

# Latest by ascending order_date.
get_latest_by = "order_date"

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

managed

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

设置为False时,不会进行迁移。

order_with_respect_to

使该对象相对于给定字段(通常是一个外键)可排序。这可用于使相关对象相对于父对象可排序。例如,如果一个Answer与一个Question对象有关,并且一个Question有多个Answer,而且Answer的顺序很重要,那么您可以这样做:

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 t_to时,将提供另外两个方法来检索和设置相关对象的顺序:get_RELATED_order()和set_RELATED_order(),其中RELATED是小写的模型名称。例如,假设一个问题对象有多个相关的回答对象,返回的列表包含相关回答对象的主键:

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

问题对象的相关回答对象的顺序可以通过传入一个回答主键列表来设置

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

相关的对象还获得两个方法,get_next_in_order()和get_previous_in_order(),可以使用它们以正确的顺序访问这些对象。假设答案对象是按id排序的:

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

在内部,order_with_respect t_to添加一个名为_order的额外字段/数据库列,并将模型的order选项设置为该字段。因此,order_with_respect t_to和order不能一起使用,而order_with_respect t_to添加的order将在您获得此模型的对象列表时应用。

Changing order_with_respect_to
因为order_with_respect t_to添加了一个新的数据库列,所以如果您在初始迁移之后添加或更改order_with_respect t_to,那么一定要进行并应用适当的迁移。

ordering

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

ordering = ['-order_date']

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

您还可以使用查询表达式。要按作者升序排序并使null值最后排序,请使用这个

from django.db.models import F

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

permissions

创建此对象时进入权限表的额外权限。为每个模型自动创建添加、更改、删除和视图权限。这个例子指定了一个额外的权限can_deliver_pizzas

permissions = (("can_deliver_pizzas", "可提供pizza"),)

default_permissions

默认为('add', 'change', 'delete', 'view')。例如,如果您的应用程序不需要任何默认权限,您可以通过将该列表设置为空列表来定制该列表。迁移创建模型之前,必须在模型上指定它,以防止创建任何遗漏的权限。

proxy

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

required_db_features

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

required_db_vendor

此模型专用于的受支持的数据库供应商的名称。当前的内置厂商名称是:sqlite, postgresql, mysql, oracle。如果该属性不是空的,且当前连接供应商不匹配该属性,则模型将不会同步。

select_on_save

1.6版本前室友select检查更新

indexes

要在模型上定义的索引列表:

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

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

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

unique_together在处理单个字段集时可以是单个元组:

unique_together = ("driver", "restaurant")

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

违反约束时在模型验证过程中引发的验证错误包含unique_together错误代码。

index_together

推荐使用indexes

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

在处理单个字段集时,index_together可以是单个列表:

index_together = ["pub_date", "deadline"]

verbose_name

对象的复数名称:

verbose_name_plural = "stories"

如果没有指定,django 将会使用verbo_name + "s"定义它

Read-only Meta attributes

label

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

label_lower

小写的label

如:“polls.QAuestion”。

posted @ 2018-09-10 17:28  Super-Yan  阅读(161)  评论(0编辑  收藏  举报