Django 模型之 Meta 选项详解
MEAT 选项
Django 模型类的 Meta 是一个内部类, 它用于定义一些 Django 模型类的行为特性. 而可用的选项大致包含以下几类
abstract
这个属性是定义当前的模型是不是一个抽象类. 所谓抽象类是不会对应数据库表的. 一般我们用它来归纳一些公共属性字段, 然后继承它的子类可以继承这些字段.
Options.abstract
如果 abstract = True 这个 model 就是一个抽象类
app_label
这个选型只在一种情况下使用, 就是你的模型不在默认的应用程序包下的 models.py 文件中, 这时候需要指定你这个模型是哪个应用程序的.
Options.app_label
如果一个 model 定义在默认的 models.py, 例如如果你的 App 的 models 在 myapp.models 子模块下, 你必须定义 app_label 让 Django 知道它属于哪一个 App
- app_label = 'myapp'
- label
对象的表示, 返回 app_label.object_name, 例如'polls.Question'.
label_lower
模型的表示, 返回 app_label.model_name, 例如'polls.question'.
db_table
db_table 是指定自定义数据库表明的. Django 有一套默认的按照一定规则生成数据模型对应的数据库表明.
Options.db_table
定义该 model 在数据库中的表名称
db_table = 'Students'
如果你想使用自定义的表名, 可以通过以下该属性
- table_name = 'my_owner_table'
- db_teblespace
- Options.db_teblespace
定义这个 model 所使用的数据库表空间. 如果在项目的 settin 中定义那么它会使用这个值
- get_latest_by
- Options.get_latest_by
在 model 中指定一个 DateField 或者 DateTimeField. 这个设置让你在使用 model 的 Manager 上的 lastest 方法时, 默认使用指定字段来排序
Django 管理器给我们提供有 latest()和 earliest()方法, 分别表示获取最近一个和最前一个数据对象. 但是, 如何来判断最近一个和最前面一个呢? 也就是根据什么来排序呢? get_latest_by 元数据选项帮你解决这个问题, 它可以指定一个类似 DateField,DateTimeField 或者 IntegerField 这种可以排序的字段, 作为 latest()和 earliest()方法的排序依据, 从而得出最近一个或最前面一个对象.
- managed
- Options.managed
默认值为 True, 这意味着 Django 可以使用 syncdb 和 reset 命令来创建或移除对应的数据库. 默认值为 True, 如果你不希望这么做, 可以把 manage 的值设置为 False
该元数据默认值为 True, 表示 Django 将按照既定的规则, 管理数据库表的生命周期. 如果设置为 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 为降序, 在以 author 升序排列
- permissions
permissions 主要是为了在 Django Admin 管理模块下使用的, 如果你设置了这个属性可以让指定的方法权限描述更清晰可读. Django 自动为每个设置了 admin 的对象创建添加, 删除和修改的权限.
用于当创建对象时增加额外的权限, Django 会为每个模型自动创建, 增删该 3 个权限, 它是一个包含二元组的元组或者列表, 格式为 (permission_code, human_readable_permission_name).
- permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)
- proxy
这是为了实现代理模型使用的, 如果 proxy = True, 表示 model 是其父的代理 model
如果设置了 proxy = True, 表示使用代理模式的模型继承方式. 具体内容与 abstract 选项一样
unique_together
unique_together 这个选项用于: 当你需要通过两个字段保持唯一性时使用. 比如假设你希望, 一个 Person 的 FirstName 和 LastName 两者的组合必须是唯一的, 那么需要这样设置:
unique_together = (("first_name", "last_name"),)
一个 ManyToManyField 不能包含在 unique_together 中. 如果你需要验证关联到 ManyToManyField 字段的唯一验证, 尝试使用 signal(信号)或者明确指定 through 属性.
用来设置的不重复的字段组合, 它是一个元组的元组, 组合起来的时候必须是唯一的.
这个元数据是非常重要的一个! 它等同于数据库的联合约束!
举个例子, 假设有一张用户表, 保存有用户的姓名, 出生日期, 性别和籍贯等等信息. 要求是所有的用户唯一不重复, 可现在有好几个叫 "张伟" 的, 如何区别它们呢?(不要和我说主键唯一, 这里讨论的不是这个问题)
我们可以设置不能有两个用户在同一个地方同一时刻出生并且都叫 "张伟", 使用这种联合约束, 保证数据库能不能重复添加用户(也不要和我谈小概率问题). 在 Django 的模型中, 如何实现这种约束呢?
使用 unique_together, 也就是联合唯一!
比如:
unique_together = (('name', 'birth_day', 'address'),)
这样, 哪怕有两个在同一天出生的张伟, 但他们的籍贯不同, 也就是两个不同的用户. 一旦三者都相同, 则会被 Django 拒绝创建. 这一元数据经常被用在 admin 后台, 并且强制应用于数据库层面.
unique_together 接收一个二维的元组((xx,xx,xx,...),(),(),()...), 每一个元素都是一个元组, 表示一组联合唯一约束, 可以同时设置多组约束. 为了方便, 对于只有一组约束的情况下, 可以简单地使用一维元素, 例如:
unique_together = ('name', 'birth_day', 'address')
联合唯一约束无法作用于普通的多对多字段.
verbose_name
verbose_name 的意思很简单, 就是给你的模型类起一个更可读的名字一般定义为中文, 我们:
- verbose_name = "学校"
- verbose_name_plural
这个选项是指定, 模型的复数形式是什么, 比如:
verbose_name_plural = "学校"
如果不指定 Django 会自动在模型名称后加一个's'
default_related_name
关联对象反向查找源对象时用到的名称, 默认为_set. 也可以直接模型类中定义一个 related_name 来覆盖默认值
default_permissions
Django 默认给所有的模型设置 ('add', 'change', 'delete') 的权限, 也就是增删改. 你可以自定义这个选项, 比如设置为一个空列表, 表示你不需要默认的权限, 但是这一操作必须在执行 migrate 命令之前.
required_db_features
声明模型依赖的数据库功能. 比如['gis_enabled'], 表示模型的建立依赖 GIS 功能.
required_db_vendor
声明模型支持的数据库. Django 默认支持 SQLite, PostgreSQL, MySQL, oracle
select_on_save
决定是否使用 1.6 版本之前的 django.db.models.Model.save()算法保存对象. 默认值为 False. 这个选项我们通常不用关心.
indexes
要在模型上定义的索引的列表:
- from django.db import models
- class Customer(models.Model):
- 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'),
- ]
来源: http://www.bubuko.com/infodetail-3298202.html