Django 模型元属性,元属性是“模型中任意非模型字段的内容”,例如排序功能、数据表名、人类可读的名字(单数形式和复数形式),所有元属性都是可选的。
通过在模型中添加一个叫作Meta的子类,定义模型元属性。
在详细介绍模型元属性之前,先看一下如何在Django模型中使用元属性:
# www.coolcou.com
from django.db import models
class Ox(models.Model):
horn_length = models.IntegerField()
class meta:
ordering = ["horn_length"]
verbose_name_plural = "oxen"
通过设置元属性,上面Ox模型将会默认使用horn_length排序,在Admin页面显示的复数形式名字叫Oxen。
- abstract
如果设置abstract = True,当前模型将成为一个抽象类。例如:
# www.coolcou.com
from django.db import models
class CommonInfo(modeks.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
class Meta:
abstract = True
class Student(CommonInfo):
home_group = models.CharField(max_length=5)
- app_label
如果模型定义没有注册到INSTALLED_APPS,那么就必须使用app_label选项在Meta类指定所属的应用程序名字。 -
db_table
当前模型所使用的数据表名。
默认情况下,Django会自动根据应用程序名+模型名生成数据表名。例如前面示例代码中的polls应用程序,生成的数据表叫作polls_question
、polls_choice
。
如果觉得Django自动生成的表名不好看,那么可以通过db_table来重新定义表名。在这里即使表名不合法也没关系,Django会替我们处理它,不过最好还是使用合规的名字。
- Ordering
默认的排序字段,当从数据库中查找数据时会按照Ordering指定的字段排序显示。
该属性是一个元组、列表或者查询表达式,每一个元组或列表的元素就是一个字段名,默认是正序排序,如果给字段名前添加一个“-”符号则会按照倒序排序。如果在字段名前面加“?”
的话就会随机提取数据。
例如,按照pub_date倒序、author正序查找数据:
ordering = ['-pub_date', 'author']
在Django 2.0中增加了对查询表达式的支持,例如根据author字段进行排序,当author字段值为null时,数据放在最后显示:
from django.db.models import F
ordering = [F('author').asc(null_last=True)]
- Indexes
用来定义数据库索引,形式如下:
from django.db import models
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")
- verbose_name
便于人类读取的模型名称,单数形式。
代码形式如下:
verbose_name = "pizza"
如果没有指定verbose_name
,Django会根据模型类名自动创建verbose_name,如模型CamelCase对应的verbose_name为camel case。
- verbose_name_plural
便于人类读取的模型名称,复数形式。
代码形式如下:
verbose_name_plural = "stories"
如果没有指定verbose_name_plural的话,Django会自动生成,形式为:verbose_name + “s”
。
酷客教程相关文章:
评论前必须登录!
注册