Django model class Meta原理解析


Posted in Python onNovember 14, 2020

通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样:

class Foo(models.Model):
bar = models.CharField(maxlength=30)

class Meta:
# ...

Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等.

下面是所有可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta 到你的 model 完全是可选的.

app_label

app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包下的models.py文件中,这时候你需要指定你这个模型类是那个应用程序的。比如你在其他地方写了一个模型类,而这个模型类是属于myapp的,那么你这是需要指定为:

app_label='myapp'

db_table

db_table是用于指定自定义数据库表名的。Django有一套默认的按照一定规则生成数据模型对应的数据库表名,如果你想使用自定义的表名,就通过这个属性指定,比如:

table_name='my_owner_table'

若不提供该参数, Django 会使用 app_label + '_' + module_name 作为表的名字.

若你的表的名字是一个 SQL 保留字, 或包含 Python 变量名不允许的字符--特别是连字符 --没关系. Django 会自动在幕后替你将列名字和表名字用引号引起来.

db_tablespace

有些数据库有数据库表空间,比如Oracle。你可以通过db_tablespace来指定这个模型对应的数据库表放在哪个数据库表空间。

get_latest_by

由于Django的管理方法中有个lastest()方法,就是得到最近一行记录。如果你的数据模型中有 DateField 或 DateTimeField 类型的字段,你可以通过这个选项来指定lastest()是按照哪个字段进行选取的。

一个 DateField 或 DateTimeField 字段的名字. 若提供该选项, 该模块将拥有一个 get_latest() 函数以得到 "最新的" 对象(依据那个字段):

get_latest_by = "order_date"

managed

由于Django会自动根据模型类生成映射的数据库表,如果你不希望Django这么做,可以把managed的值设置为False。

默认值为True,这个选项为True时Django可以对数据库表进行 migrate或migrations、删除等操作。在这个时间Django将管理数据库中表的生命周期

如果为False的时候,不会对数据库表进行创建、删除等操作。可以用于现有表、数据库视图等,其他操作是一样的。

order_with_respect_to

这个选项一般用于多对多的关系中,它指向一个关联对象。就是说关联对象找到这个对象后它是经过排序的。指定这个属性后你会得到一个get_XXX_order()和set_XXX_order()的方法,通过它们你可以设置或者回去排序的对象。

举例来说, 如果一个 PizzaToppping 关联到一个 Pizza 对象, 这样做:

order_with_respect_to = 'pizza'

...就允许 toppings 依照相关的 pizza 来排序.

ordering

这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的。比如下面的代码:

ordering=['order_date']
# 按订单升序排列
ordering=['-order_date']
# 按订单降序排列,-表示降序
ordering=['?order_date']
# 随机排序,?表示随机
ordering = ['-pub_date', 'author']
# 对 pub_date 降序,然后对 author 升序

需要注意的是:不论你使用了多少个字段排序, admin 只使用第一个字段

permissions

permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。

要创建一个对象所需要的额外的权限. 如果一个对象有 admin 设置, 则每个对象的添加,删除和改变权限会人(依据该选项)自动创建.下面这个例子指定了一个附加权限: can_deliver_pizzas:

permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)

这是一个2-元素 tuple 的tuple或列表, 其中两2-元素 tuple 的格式为:(permission_code, human_readable_permission_name).

unique_together

unique_together这个选项用于:当你需要通过两个字段保持唯一性时使用。这会在 Django admin 层和数据库层同时做出限制(也就是相关的 UNIQUE 语句会被包括在 CREATE TABLE 语句中)。比如:一个Person的FirstName和LastName两者的组合必须是唯一的,那么需要这样设置:

unique_together = (("first_name", "last_name"),)

verbose_name

verbose_name的意思很简单,就是给你的模型类起一个更可读的名字:

verbose_name = "pizza"

若未提供该选项, Django 则会用一个类名字的 munged 版本来代替: CamelCase becomes camel case.

verbose_name_plural

这个选项是指定,模型的复数形式是什么,比如:

verbose_name_plural = "stories"

若未提供该选项, Django 会使用 verbose_name + "s".

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python脚本实现DNSPod DNS动态解析域名
Feb 14 Python
python3简单实现微信爬虫
Apr 09 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
基于python实现简单日历
Jul 28 Python
将python文件打包成EXE应用程序的方法
May 22 Python
树莓派实现移动拍照
Jun 22 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
Python sorted排序方法如何实现
Mar 31 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
Python 合并拼接字符串的方法
Jul 28 Python
详解python爬取弹幕与数据分析
Nov 14 #Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 #Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 #Python
基于Python的身份证验证识别和数据处理详解
Nov 14 #Python
Python join()函数原理及使用方法
Nov 14 #Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 #Python
利用python 下载bilibili视频
Nov 13 #Python
You might like
桌面中心(一)创建数据库
2006/10/09 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
python多线程方式执行多个bat代码
2016/06/07 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
python用700行代码实现http客户端
2021/01/14 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
锐步英国官网:Reebok英国
2019/11/29 全球购物
求职信模板怎么做
2014/01/26 职场文书
股权投资意向书
2014/04/01 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers