Django模型Meta选项详解
Django默认生成的表名是小写的应用名_小写的模型类名
可以通过在模型类中定义Meta类来更改表名:
class User(models.Model):
"""用户类"""
name = models.CharField(max_length=20)
create_date = models.DateField(auto_now_add=True)
# 使用自定义的模型管理器(默认的objects就不会在使用)
objects = UserManager()
def __str__(self):
return self.name
class Meta(object):
# 定义表名
db_table = "user"
# 定义在管理后台显示的名称
verbose_name = '用户'
# 定义复数时的名称(去除复数的s)
verbose_name_plural = verbose_name
Django模型类的Meta是一个内部类,它使用内部Meta类为模型分配元数据。它用于定义一些 Django 模型类的行为特征。大致包括以下几类:
abstract
定义当前模型是否为抽象类。所谓抽象类并不对应数据库表。它用来概括一些公共属性字段,然后子类可以继承这些字段。
Options.abstract 如果abstract = True,则该模型是一个抽象类
app_label
此选项仅在一种情况下使用,即您的模型不在默认应用程序包文件下的 models.py 中,您必须指明您的模型属于哪个应用程序。
Options.app_label
如果模型是在默认的 models.py 中定义的,例如你的应用程序的模型位于 myapp.models 子模块下,则需要定义 app_label 让 Django 知道它是哪个模型属于. app
app_label = 'myapp'
db_table
db_table 指定自定义数据库表的名称。Django有一套标准的数据库表示形式,对应于根据一定规则生成的数据模型。
Options.db_table
定义数据库中模型的表名称
db_table = 'Students'
如果想使用自定义表名称,可以传递以下属性
table_name = ' my_owner_table '
数据表名称
Django 根据模型类的名称和包含它的应用程序的名称自动分配数据库表名称。模型的数据库表的名称,由模型的“应用程序标记”(manage.py startapp 中使用的名称)和模型类名称后跟下划线组成。
例如,书店应用程序(使用manage.py startapp bookstore创建)有一个名为Book的模型,数据表的名称为bookstore_book。
使用Meta类中的db_table参数重写数据表的名称。
数据表名称可以是保留的SQL字,也可以包含Python变量中不允许的特殊字符。这是因为Django会自动为列名和表名添加引号。
MySQL 中的表名使用小写
通过 db_table 覆盖表名时,强烈建议使用小写表名,特别是如果您使用 MySQL 作为后端。
引用Oracle中的表名
为了遵守Oracle中的30个字符限制和一些常见约定,Django将缩短表名并将所有内容转换为大写。通过在 db_table 的值周围加上引号来避免这种情况:
db_table = '"name_left_in_lowercase"'
这样的带引号的名称也可以与 Django 支持的其他数据库后端一起使用,但除了 Oracle 之外,引号不起作用。
db_teblespace
Options.db_teblespace
定义此模型使用的数据库表空间。如果在项目设置中定义,它将使用此值
default_lated_name
Options.default_lated_name
默认情况下,此名称用于相关对象和当前对象之间的关系。默认为_set。
由于字段的反向名称必须是唯一的,因此在对模型进行子类化时需要格外小心。为了避免名称冲突,部分名称必须包含 '%(app_label)s' 和 '%(model_name)s',它们将替换为应用标签名称和模型名称,均为小写。
get_latest_by
Options.get_latest_by
在模型中指定 DateField 或 DateTimeField。此设置允许您在模型的 Manager 中使用最新方法时默认使用指定字段进行排序
Managed
Options.management
默认值为 True,这意味着 Django 有合适的数据表在migre命令中创建,并将在flush管理命令中删除它们。换句话说,Django将管理这些数据表的生命周期。
如果为 False,Django将不会为当前模型创建或删除数据表。如果当前模型表示使用其他方法创建的现有数据库视图或表,这非常有用。如果将其设置为 Managed=False,这是唯一的区别。模型处理的所有其他方面都与往常一样。这包括:
如果您未声明,则向模型添加自动递增主键。为了避免后续代码的读者感到困惑,强烈建议在使用非托管模型时指定数据表中的所有列。
如果 Managed=False 的模型包含指向另一个非托管模型的 ManyToManyField,则不会创建多对多联接的中介表。但是,中介表是在托管模型和非托管模型之间创建的。
如果您需要更改此默认行为,请将中介表创建为显式模型(设置为托管),并使用 ManyToManyField.through 为您的自定义模型创建链接。
对于使用 Managed=False 测试模型,您需要确保在测试开始时创建正确的表。
如果您有兴趣在 Python 级别更改模型类的行为,您可以设置 Managed=False 并创建现有模型的副本。
order_with_respect_to
此选项通常用于多对多关系。它指向一个链接对象,也就是说链接对象找到这个对象后,就会对其进行排序。指定此属性后,您将获得 get_xxx_order() 和 set_xxx_order() 方法,这两个方法允许您设置或返回排序后的对象
ordering
。该字段告诉 Django 模型对象根据其返回的记录结果集。字段已排序。这是一个元组或字符串列表,每个字符串都是一个字段,由可选的“-”组成,表示降序。如果字段名称前面没有“-”,则默认按升序排列。使用 '?'会随机排序
- ordering=['order_date'] # 按升序排序
- ordering=['-order_date'] # 按降序排序,-表示降序
- ordering=[ ' ?order_date'] #随机排序,?表示随机
- ordering=['-pub_date','author'] # 对 pub_date 进行降序排序,对作者进行升序排序。
权限
权限主要用于在 Django Admin 管理模块下使用。设置该属性可以使指定的方法权限描述更加清晰、更具可读性。 Django 会自动为设置为管理员的任何对象创建添加、删除和修改权限。
permissions = (('can_deliver_pizzas','可以送披萨'))
proxy
用于实现代理模型。如果 proxy = True,则表示该模型是父模型
unique_together
unique_together 的代理模型。当您想要通过两个字段保持唯一性时,可以使用此选项。例如,如果您希望一个人的名字和姓氏的组合应该是唯一的,您可以将其设置如下:
unique_together = (("first name", "last name"),)
ManyToManyField 不能包含在 unique_together 中。如果要验证与 ManyToManyField 字段关联的唯一验证,请尝试使用 signal 或显式指定 through 属性。
verbose_name
verbose_name 是模型类的更易读的名称。一般用中文定义,如:
verbose_name = "school"
verbose_name_plural
该选项指定模型的复数形式是什么。 ,
verbose_name_plural = "school" 如果未指定 Django,则模型名称末尾会自动添加“s”。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。