django1.8 model : Meta options
Posted 黑猫-警长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django1.8 model : Meta options相关的知识,希望对你有一定的参考价值。
此文翻译自django1.8.2官方文档
Model Meta options
这篇文档解释了所有在模型内置类Meta中可用的元数据选项(metadata options)
Available Meta options
abstract
Options.abstract
如果abstract = True,这个模型就是一个抽象基类.
app_label
Options.app_label
如果一个模型在标准路径(models.py或app内的models包)之外,模型必须定义它数据哪个app:
app_label = 'myapp'
django1.7新增
如果模型定义在应用的models模块外,app_label不是必需的.
db_table
Options.db_table
模型使用的数据库表的名称:
db_table = 'music_album'
Table names
为了节省时间,django会根据模型类的名称和包含模型的app自动生成表名.模型的表名由模型的”app_label”-manage.py startapp是hi用的名称-和模型的类名,和中间的下划线组成.
例如,如果你有一个app bookstore(又manage.py startapp bookstore创建),一个模型类Book,那么表名就是bookstore_book.
使用Meta类的db_table变量可以重写数据库表名.
如果你的数据库表名是SQL关键字,或者包含非python标识符-特别是,连接符-这没有问题,django会在字段和表名加上引用.
Use lowercase table name for MySQL
强烈建议通过db_table来重写表名时使用小些的表名,特别是使用mysql时.Table name quotiong for Oracle
为了满足Oracle的表名的30字符限制,并遵守Oracle数据库的惯例,django会缩短表名,并全部转换成大写.为了避免这种转换,db_table使用引用名:
db_table = '"name_left_in_lowercase"'
这种引用名也可用于其他django支持的数据库;但是除了Oracle,引用没有什么影响.
db_tablespace
Options.db_tablespace
模型使用的数据库表空间的名字.默认是项目的DEFAULT_TABLESPACE设置.如果数据库不支持表空间,这个选项会忽略.
default_related_name
Options.default_related_name
django1.8新增
关联对象关联回这个模型用的名字.默认是_set.
作为字段的反向名称必须唯一,如果你的模型有子类就要注意了.为了避免名称冲突,名字部分应包含’%(app_label)s’和’%(model_name)s’,这会分别被应用名和模型名替代,都是小写.
get_latest_by
Options.get_latest_by
模型中一个可排序字段的名称,典型的有DateField,DateTimeField或IntegerField.指定在模型Manger中的latest()和earliest()方法使用的默认字段.
例如:get_latest_by = "order_date"
详情请查看latest()文档.
managed
Options.managed
默认是True,意思是django会创建对应的数据库表in migrate或作为migrations的一部分,删除它们作为flush management command的一部分.也就是说,django管理数据库表的生命周期.
如果是False,这个模型就没有数据库表的创建和删除操作.这用于模型已经有对应的表或数据库视图已经创建了.当managed=False时仅有一个区别.模型处理的其他部分都是一样的,包括
1. 如果你没有声明主键,django会自动添加主键字段到模型.为了避免给后来的代码阅读者带来困惑,建议如果使用unmanaged模型,指定所有的数据库字段.
2. 如果一个managed=False模型包含一个ManyToManyField指向另一个unmanaged模型,作为多对多连接的中介表(intermedia tabel)也不会被创建.但是一个managed模型和一个unmanaged模型的中介表会被创建.如果你想改变这个默认行为,作为一个显式的模型(必须设置managed)创建中介表并在模型中使用ManyToManyField.throth属性来做关联.
For tests involving models with managed=False, it’s up to you to ensure the correct tables are created as part of the test setup.
如果你想改变一个模型类的python-level行为,你可以使用managed=False并为现有模型创建一个拷贝.但是你有更好的解决方法:Proxy models
order_with_respect_to
Options.order_with_respect_to
将对象标记为按照给定字段”orderable”.This is almost always used with related objects to allow them to be ordered with respect to a parent object.例如,如果你一个Answer关联一个Question对象,一个问题有不止一个回答,回答需要排序,你可以这样做:
from django.db import models
class Question(models.Model):
text = models.TextField()
# ...
class Answer(models.Model):
question = models.ForeignKey(Question)
# ...
class Meta:
order_with_respect_to = 'question'
当order_with_respect_to设置了,会添加2个方法来查询并设置关联对象的排序:get_RELATED_order()和set_RELATED_order(),RELATED是模型名称的小写.例如,假设一个Question对象有多个关联的Answer对象,返回的列表包含了关联的Answer对象的主键:
>>> question = Question.objects.get(id=1)
>>> question.get_answer_order()
[1, 2, 3]
Question对象关联的Answer对象的顺序可以通过传递一个Answer主键列表来设置:
>>> question.set_answer_order([3, 1, 2])
关联对象也有2个方法,get_next_in_order()和get_previous_in_order(),可以用来按照特定的顺序访问这些对象.假设Answer对象按照id排序:
>>> answer = Answer.objects.get(id=2)
>>> answer.get_next_in_order()
<Answer: 3>
>>> answer.get_previous_in_order()
<Answer: 1>
更改order_with_respect_to
order_with_respect_to adds an additional field/database column named _order, so be sure to make and apply the appropriate migrations if you add or change order_with_respect_to after your initial migrate.
ordering
Options.ordering
当获取对象列表时,对象的默认排序规则:
ordering = ['-order_date']
是一个字符串列表或元组.每个字符串是字段名和表示降序的可选的”-“前缀.没有前缀”-“的字段表示升序排列.使用字符串”?”表示随机排列.
例如,要根据pub_date升序排列,这样使用:
ordering = ['pub_date']
要根据pub_date降序排列,这样使用:
ordering = ['-pub_date']
先按照pub_date降序排列,再按照author升序排列,这样使用:
ordering = ['-pub_date', 'author']
警告
排序不是随心所欲,想用就用的.每个你添加到ordering里的字段都会造成数据库开销.你添加的外键也会隐式的包含所有它的默认排序.
permissions
Options.permissions
Extra permissions to enter into the permissions table when creating this object.添加,删除和修改权限是自动为每个模型创建的.这个例子指定了一个额外的权限,can_deliver_pizzas:
permissions = (('can_deliver_pizzas', 'Can deliver pizzas'),)
This is a list or tuple of 2-tuples in the format (permission_code,human_readable_permission_name).
这是一个由格式为(permission_code, human_readable_permission_name)的2元素元组构成的列表或元组.
default_permissions
Options.default_permissions
django1.7新增
默认为(‘add’, ‘change’, ‘delete’).你可以自定义,例如,如果你的应用不需要任何默认权限你可以设置为空列表.必须在模型通过migrate创建前指定,防止在创建时没有权限.
proxy
Options.proxy
如果proxy = True,继承自其他模型的模型会当作代理模型.
select_on_save
Options.select_on_save
决定django是否使用pre-1.6 django.db.models.Model.save()算法.旧的算法使用SELECT决定是否有存在的数据行要更新.新的算法直接使用UPDATE.在少数情况下一个数据行UPDATE对于django是不可见的(visible).一个例子是在PostgreSQL中ON UPDATE触发器会返回NULL.在这种情况下,新的算法最终会执行INSERT,即使数据库中已经有了一行数据.
通常没有必要设置这个属性.默认是False.
更多的新旧saving算法请查看django.db.models.Model.save()
unique_together
Options.unique_together
字段放到一起,必须唯一:
unique_together = (("driver", 'restaurant'),)
元组里的元组里的元素放在一起必须唯一.在django amdin里有有使用,在数据库层(即CREATE TABLE语句里包含对应的UNIQUE语句)强制执行.
为了方便,unique_together如果只有一个字段集的时候可以是一个元组:
unique_together = ('driver', 'restaurant')
unique_together不能包含ManyToManyField.(这样做是什么意思都不知道!)如果你需要验证关联到ManyToManyField的唯一性,可以用信号或一个显式的through模型.
django1.7新增
The ValidationError raised during model validation when the constraint is violated has the unique_together error code.
index_together
Options.index_together
字段名放到一起,做索引:
index_together = [['pub_date', 'deadline'],]
放到一起的字段做联合索引(即执行对应的CREATE INDEX语句)
django1.7新增
为了方便,如果只有一个联合索引,index_together可以是单个列表:
index_together = ['pub_date', 'deadline']
verbose_name
Options.verbose_name
对象的给人读的名字,单数:
verbose_name = 'pizza'
如果没有指定,django会使用类名的转换版本:CamelCase变成camel case.
verbose_name_plural
Options.verbose_name_plural
对象的复数名字:
verbose_name_plural = 'stories'
如果没有指定,django会使用verbose_name + ‘s’.
以上是关于django1.8 model : Meta options的主要内容,如果未能解决你的问题,请参考以下文章