首页 > 技术文章 > 模型层Meta详解

yyyzyyyz 2021-10-26 09:25 原文

模型层Meta详解

在创建表时,我们可以添加Meta类,按照官方文档的解释,它是“anything that’s not a field”(除了字段的一切属性),用来配置一张表的其他参数。

1 Meta的使用

from django.db import models

class Ox(models.Model):
    horn_length = models.IntegerField()
	# 在类中嵌套定义Meta类,每条参数占用一行
    class Meta:
        verbose_name_plural = "oxen"

2 可选字段

1)abstract

abstract=True/False(默认)

当你想要抽象出一些共有的字段(比如说创建时间、名称、修改时间等),但又不希望为这些字段创建一张表,将其设置为True

class Basicfield(models.Model):
    is_delete = models.BooleanField(default=0)
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    last_update_time = models.DateTimeField(auto_now=True, verbose_name="修改时间")
    class Meta:
        abstract=True # 抽象表,数据库中不会建这张表

2)db_table

db_table = 'Table names'

Django在创建表时,默认会将app名和class类名通过下划线连接成为数据库的表名,For example, if you have an app bookstore, a model defined as class Book will have a database table named bookstore_book.

如果想要覆盖这个名字,使用这个字段,并设置成你自定义的名称。

注意:

  • 如果使用MariaDB、MySQL,强烈建议设置为小写英文
  • 如果使用Oracle(表名有30字符限制),Django可能会自动缩减表名并将其全部变成大写,为了防止自动转换,使用带引号的名称来设置db_table = '"name_left_in_lowercase"'这样的引号也可以用在 Django 的其他支持的数据库,但是除了 Oracle,引号没有任何作用。

3)unique_together

对于单个字段的,可以直接在定义字段的时候设置unique=True,对于多个字段的唯一可以使用unique_together

unique_together = ['driver', 'restaurant']  # 单组字段直接用列表

unique_together = [['driver', 'restaurant'],['name','gender']]  # 需要设置多组字段时,内部用列表分隔开

这表示这些字段在联合起来是唯一的。

注意:

  • ManyToManyField不能被包含在其中,如果需要验证多对多字段的唯一性,可以考虑使用信号或者显式使用through。
  • 可以在constraints约束参数中使用UniqueConstraint设置唯一约束,而unique_together可能会被废弃。

4)index_together

联合索引。

index_together = ["pub_date", "deadline"]  # 单组字段直接用列表


index_together = [
    ["pub_date", "deadline"],              # 需要设置多组字段时,内部用列表分隔开
]

注意:

  • 可以使用另一个字段indexes设置联合索引,而index_together可能会被废弃。

5)verbose_name

一个更人性化的名字,适合阅读。

verbose_name = "pizza"

6)verbose_name_plural

复数形式的verbose_name。

verbose_name_plural = "stories"

如果不加该参数,默认会使用'verbose_name'+'s'

3 更多字段

有关更多的Meta字段,参阅官方文档:https://docs.djangoproject.com/en/3.2/ref/models/options/

推荐阅读