Django Models的Meta选项详解

2023-07-1719:58:39后端程序开发Comments844 views字数 3484阅读模式

Django默认生成的表名为应用名小写_模型类名小写文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

可以通过在模型类中定义Meta类来修改表名:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

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.nameclass Meta(object):# 定义表名        db_table = "user"# 定义在管理后台显示的名称        verbose_name = '用户'# 定义复数时的名称(去除复数的s)        verbose_name_plural = verbose_name

Django模型类的Meta是一个内部类,使用内部 Meta类 来给模型赋予元数据,它用于定义一些Django模型类的行为特性。大致包含以下几类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

abstract

定义当前的模型是不是一个抽象类。所谓抽象类是不会对应数据库表的,用它来归纳一些公共属性字段,然后它的子类可以继承这些字段。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

Options.abstract 如果abstract = True 这个model就是一个抽象类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

app_label

这个选项只在一种情况下使用,就是你的模型不在默认的应用程序包下的models.py文件中,这时候需要指定你这个模型是哪个应用程序的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

Options.app_label
如果一个model定义在默认的models.py,例如如果你的app的models在myapp.models子模块下,你必须定义app_label让Django知道它属于哪一个app
app_label = 'myapp'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

db_table

db_table是指定自定义数据库表名的。Django有一套默认的按照一定规则生成数据模型对应的数据库表明。
Options.db_table
定义该model在数据库中的表名称
db_table = 'Students'
如果你想使用自定义的表名,可以通过以下该属性
table_name = 'my_owner_table'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

数据表名称文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

Django 会根据模型类的名称和包含它的应用的名称自动指定数据库表名称。一个模型的数据库表名称,由这个模型的“应用标签”(在manage.py startapp中使用的名称)和模型类名称之间加上下划线组成。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

举个例子,  bookstore应用(使用  manage.py startapp bookstore 创建),里面有个名为 Book的模型,那数据表的名称就是  bookstore_book 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

使用 Meta类中的 db_table 参数来重写数据表的名称。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

数据表名称可以是 SQL 保留字,也可以包含不允许出现在 Python 变量中的特殊字符,这是因为 Django 会自动给列名和表名添加引号。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

在 MySQL中使用小写字母为表命名文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

当你通过db_table重写表名称时,强烈推荐使用小写字母给表命名,特别是如果你用了MySQL作为后端。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

Oracle中表名称的引号处理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

为了遵从Oracle中30个字符的限制,以及一些常见的约定,Django会缩短表的名称,而且会把它全部转为大写。在db_table的值外面加上引号来避免这种情况:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

db_table = '"name_left_in_lowercase"'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

这种带引号的名称也可以用于Django所支持的其他数据库后端,但是除了Oracle,引号不起任何作用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

db_teblespace

Options.db_teblespace
定义这个model所使用的数据库表空间。如果在项目的settin中定义那么它会使用这个值文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

default_related_name

Options.default_related_name
这个名字会默认被用于一个关联对象到当前对象的关系。默认为 <model_name>_set。
由于一个字段的反转名称应该是唯一的,当你给你的模型设计子类时,要格外小心。为了规避名称冲突,名称的一部分应该含有'%(app_label)s'和'%(model_name)s',它们会被应用标签的名称和模型的名称替换,二者都是小写的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

get_latest_by

Options.get_latest_by文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

在model中指定一个DateField或者DateTimeField。这个设置让你在使用model的Manager上的lastest方法时,默认使用指定字段来排序文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

managed

Options.managed
默认为True,意思是Django在migrate命令中创建合适的数据表,并且会在 flush 管理命令中移除它们。换句话说,Django会管理这些数据表的生命周期。
如果是False,Django 就不会为当前模型创建和删除数据表。如果当前模型表示一个已经存在的,通过其它方法建立的数据库视图或者数据表,这会相当有用。这是设置为managed=False时唯一的不同之处。. 模型处理的其它任何方面都和平常一样。这包括:
如果你不声明它的话,会向你的模型中添加一个自增主键。为了避免给后面的代码读者带来混乱,强烈推荐你在使用未被管理的模型时,指定数据表中所有的列。
如果一个带有managed=False的模型含有指向其他未被管理模型的ManyToManyField,那么多对多连接的中介表也不会被创建。但是,一个被管理模型和一个未被管理模型之间的中介表会被创建。
如果你需要修改这一默认行为,创建中介表作为显式的模型(设置为managed),并且使用ManyToManyField.through为你的自定义模型创建关联。
对于带有managed=False的模型的测试,你要确保在测试启动时建立正确的表。
如果你对修改模型类在Python层面的行为感兴趣,你可以设置 managed=False ,并且为一个已经存在的模型创建一个副本。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

order_with_respect_to

这个选项一般用于多对多的关系中,它指向一个关联对象,就是说关联对象找到这个对象后它是经过排序的。指定这个属性后你会得到一个get_xxx_order()和set_xxx_order()的方法,通过它们你可以设置或者回去排序的对象文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

ordering

这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的。这是一个字符串的元组或列表,没有一个字符串都是一个字段和用一个可选的表明降序的'-'构成。当字段名前面没有'-'时,将默认使用升序排列。使用'?'将会随机排列文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

  • ordering=['order_date'] # 按订单升序排列
  • ordering=['-order_date'] # 按订单降序排列,-表示降序
  • ordering=['?order_date'] # 随机排序,?表示随机
  • ordering=['-pub_date','author'] # 以pub_date为降序,在以author升序排列

permissions

permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。Django自动为每个设置了admin的对象创建添加,删除和修改的权限。
permissions = (('can_deliver_pizzas','Can deliver pizzas'))文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

proxy

为实现代理模型使用的,如果proxy = True,表示model是其父的代理 model文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

unique_together

unique_together这个选项用于:当你需要通过两个字段保持唯一性时使用。比如假设你希望,一个Person的FirstName和LastName两者的组合必须是唯一的,那么需要这样设置:
unique_together = (("first_name", "last_name"),)
一个ManyToManyField不能包含在unique_together中。如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through属性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

verbose_name

verbose_name是模型类起一个更可读的名字一般定义为中文,如:
verbose_name = "学校"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

verbose_name_plural

这个选项是指定模型的复数形式是什么,
verbose_name_plural = "学校"如果不指定Django会自动在模型名称后加一个’s’文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/51751.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/51751.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定