Django的models.Model
类提供了一些选项,用于配置和管理模型。其中,Meta
类是models.Model
的子类,它提供了一些额外的选项,用于配置模型的属性和行为。
示例
# models.py
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
# 根据日期倒叙(从大到小)排序
ordering = ['-create_date']
下面详细介绍了Meta
类中可用的选项及其含义。
1. app_label
django.db.models.options.AppLabelClass
是 Django 中的一个类,用于指定一个模型所属的应用程序。
在Django中,每个模型都必须指定一个 app_label
属性,该属性定义了模型所属的应用程序的名称。
app_label
属性的值是一个字符串,它应该是应用程序名称的唯一标识符。
在Django中,应用程序名称通常是一个字符串,以小写字母开头,后跟一个点和一个描述应用程序类型的字符串。例如,myapp
是一个应用程序名称,myapp.models
是一个包含模型的完整应用程序名称。
在 Django 中,每个应用程序都应该有一个 app_label
属性,并且应该使用 django.db.models.options.set_label_name
方法来设置该属性。
在 Django 1.10 版本之后,set_label_name
方法已被弃用,建议使用 options.注册模型类
来代替。
在 django.db.models.options
模块中,还有一个名为 Options
的类,它用于管理模型的元数据。
可以使用 Options
类中的 app_label
属性来获取或设置模型所属的应用程序的名称。
这个选项只在一种情况下使用,就是你的模型不在默认的应用程序包下的models.py文件中,这时候需要指定你这个模型是哪个应用程序的。
指定模型所属的应用程序标识符。
- 默认为
'django_content_models'
。
2. db_table
-
指定模型在数据库中的表名。
-
Django有一套默认的按照一定规则生成数据模型对应的数据库表明。
在项目中,随着APP数量增加,数据库表越多,为了看起来简单,功能又具有共性的表可以自定义表名,大型项目不建议修改表名(别问为什么,问就是不知道,哈哈
)。
- 默认为模型类名的
驼峰式命名
。
3. ordering
指定模型在查询结果中排序的字段。
这是一个字符串的元组或列表,每一个字符串都是一个字段和用一个可选的,表明降序的'-
'构成。当字段名前面没有'-
'时,将默认使用升序排列。使用'?
'将会随机排列
ordering=['order_date'] # 按订单升序排列
ordering=['-order_date'] # 按订单降序排列,-表示降序
ordering=['?order_date'] # 随机排序,?表示随机
ordering=['-pub_date','author'] # 以pub_date为降序,在以author升序排列
- 默认为
('natural', {'fields': [], 'order_by': False})
,即按照自然顺序排序。
4. unique_together
-
指定模型的唯一性约束的字段组合。
-
字段列表中的字段名以括号括起来,每个括号内的字段名表示一个约束。
例如
# 表示 field1 和 field2字段的组合必须唯一
unique_together = (('field1', 'field2'),)
- 一个
ManyToManyField
不能包含在unique_together中。如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through
属性。
5. index_together
指定模型的索引约束的字段组合。字段列表中的字段名以括号括起来,每个括号内的字段名表示一个索引。例如index_together=(('field1', 'field2'),)
表示field1
和field2
字段的组合应该创建索引。
6. abstract
如果设置为True
,则将模型定义为抽象模型
。
抽象模型是一个只包含元信息(如__module__
和__name__
属性)的模型,没有实际的数据表。(所谓抽象类是不会对应数据库表的,用来归纳一些公共属性字段,然后它的子类可以继承这些字段。)
- 默认为
False
。
7. proxy
如果设置为True
,则将模型定义为代理模型。
代理模型是一个派生自另一个模型的模型,它继承了原始模型的属性和方法,但使用不同的数据表。默认为False
。
8. swappable
如果设置为True
,则允许其他应用程序定义与当前应用程序名称相同的模型。默认为False
。
9. swappable_setting
如果设置了swappable
为True
,则指定用于定义模型的自定义类名。默认为'django.db.models.swappable_setting'
。
10. auto_now
设置模型的自动时间戳字段(如created
或modified
)为当前时间。可以设置多个字段,它们将按顺序自动插入时间戳。
11. auto_now_add
设置模型的自动时间戳字段为当前时间,并在创建新实例时自动插入。
12. concrete
如果设置为True
,则将模型定义为具体模型。具体模型是一个派生自django.db.models.base.Model
的模型,没有继承自django.db.models.Model
。默认为False
。
13. proxy_for_model
指定代理模型的实际派生自哪个模型。
14. permissions
permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。
Django自动为每个设置了admin的对象创建添加,删除和修改的权限。
permissions = (('can_deliver_pizzas','Can deliver pizzas'))
这些选项可以根据需要进行自定义和调整,以实现模型特定的行为和约束。