Django 模型 Meta 配置完全指南
Django 模型 Meta 配置完全指南
在 Django 中,class Meta 是模型的内部类,用于配置模型的元数据(metadata)——即"关于模型的数据"。它不影响数据库表的实际字段定义,而是控制模型的行为、命名约定、管理方式和与其他模型的关系等。
以下是 Meta 类中可以配置的所有主要内容,按功能分类:
一、数据库相关配置
| 属性 | 说明 | 示例 |
|---|---|---|
db_table |
自定义数据库表名 | db_table = 'my_custom_table' |
db_table_comment |
数据库表注释(Django 4.2+) | db_table_comment = '用户表' |
managed |
是否由 Django 管理该表 | managed = False(用于已有数据库) |
ordering |
默认排序字段 | ordering = ['-created_at', 'name'] |
indexes |
自定义数据库索引 | 见下方示例 |
constraints |
数据库约束(唯一约束、检查约束等) | 见下方示例 |
class Meta: db_table = 'shop_products' db_table_comment = '商品信息表' managed = True ordering = ['-price', 'name'] indexes = [ models.Index(fields=['name'], name='name_idx'), models.Index(fields=['category', 'price'], name='category_price_idx'), ] constraints = [ models.UniqueConstraint(fields=['sku'], name='unique_sku'), models.CheckConstraint(check=models.Q(price__gte=0), name='price_non_negative'), ]
二、模型继承与抽象
| 属性 | 说明 | 示例 |
|---|---|---|
abstract |
是否为抽象基类 | abstract = True |
proxy |
是否为代理模型 | proxy = True |
base_manager_name |
自定义基础管理器名称 | base_manager_name = 'objects' |
# 抽象基类 class BaseModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) class Meta: abstract = True # 代理模型(不创建新表,仅修改 Python 行为) class Person(models.Model): name = models.CharField(max_length=100) class MyPerson(Person): class Meta: proxy = True ordering = ['name']
三、字段默认值与行为
| 属性 | 说明 | 示例 |
|---|---|---|
default_related_name |
反向关联的默认名称 | default_related_name = 'items' |
get_latest_by |
latest()/earliest() 的默认字段 |
get_latest_by = 'created_at' |
required_db_features |
所需的数据库特性 | required_db_features = ['supports_transactions'] |
required_db_vendor |
限定数据库类型 | required_db_vendor = 'postgresql' |
class Order(models.Model): created_at = models.DateTimeField(auto_now_add=True) amount = models.DecimalField(max_digits=10, decimal_places=2) class Meta: get_latest_by = 'created_at' # Order.objects.latest() 默认按 created_at default_related_name = 'orders' # 其他模型外键指向它时,反向查询名
四、Admin 后台配置
| 属性 | 说明 | 示例 |
|---|---|---|
verbose_name |
单数形式的可读名称 | verbose_name = '文章' |
verbose_name_plural |
复数形式的可读名称 | verbose_name_plural = '文章管理' |
app_label |
指定所属应用(跨应用模型) | app_label = 'content' |
class Article(models.Model): title = models.CharField(max_length=200) class Meta: verbose_name = '文章' verbose_name_plural = '文章列表' # 默认会加"s",建议手动设置中文
五、权限配置
| 属性 | 说明 | 示例 |
|---|---|---|
permissions |
自定义权限 | permissions = [('can_publish', 'Can publish posts')] |
default_permissions |
默认权限(add/change/delete/view) | default_permissions = ('add', 'change') |
class Post(models.Model): title = models.CharField(max_length=200) class Meta: permissions = [ ('can_publish', '可以发布文章'), ('can_feature', '可以置顶文章'), ] default_permissions = ('add', 'change', 'view') # 去掉 delete 权限
六、唯一性约束(已弃用)
| 属性 | 说明 | 示例 |
|---|---|---|
unique_together |
联合唯一约束(已弃用,推荐用 UniqueConstraint) |
unique_together = [['field1', 'field2']] |
index_together |
联合索引(已弃用,推荐用 Index) |
index_together = [['field1', 'field2']] |
⚠️ 注意:Django 4.2+ 中
unique_together和index_together已弃用,建议使用constraints和indexes。
七、其他配置
| 属性 | 说明 | 示例 |
|---|---|---|
app_label |
指定模型所属应用 | app_label = 'myapp' |
db_tablespace |
表空间(Oracle/PostgreSQL) | db_tablespace = 'my_tablespace' |
完整示例
from django.db import models class Product(models.Model): name = models.CharField(max_length=100, verbose_name='商品名称') sku = models.CharField(max_length=50, unique=True, verbose_name='SKU') price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格') category = models.ForeignKey('Category', on_delete=models.CASCADE) is_active = models.BooleanField(default=True, verbose_name='是否上架') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: # 数据库配置 db_table = 'shop_products' db_table_comment = '商品信息主表' # 排序与索引 ordering = ['-created_at', 'name'] indexes = [ models.Index(fields=['category', 'is_active'], name='category_active_idx'), models.Index(fields=['price'], name='price_idx'), ] # 约束 constraints = [ models.UniqueConstraint(fields=['sku'], name='unique_sku'), models.CheckConstraint(check=models.Q(price__gte=0), name='price_positive'), ] # Admin 显示 verbose_name = '商品' verbose_name_plural = '商品管理' # 查询优化 get_latest_by = 'created_at' default_related_name = 'products' # 权限 permissions = [ ('can_import', '可以批量导入商品'), ('can_export', '可以导出商品数据'), ]
快速参考图
Meta 配置分类:
├── 数据库层
│ ├── db_table / db_table_comment / managed
│ ├── ordering / indexes / constraints
│ └── required_db_features / required_db_vendor
├── 模型层
│ ├── abstract / proxy
│ └── base_manager_name
├── 关联层
│ ├── default_related_name / get_latest_by
│ └── default_permissions / permissions
└── 展示层
├── verbose_name / verbose_name_plural
└── app_label
掌握这些配置能让你更精细地控制 Django 模型的行为,特别是在处理复杂业务逻辑、性能优化或多数据库场景时非常有用。

浙公网安备 33010602011771号