Django笔记八之model中Meta参数的使用
前面介绍了 model 的字段属性,字段类型,这篇笔记介绍一下 model 的 Meta 选项。
这个选项提供了一些参数,比如排序(ordering),表名(db_table)等。
但这都不是必需的,都是作为可选项,主要是为使用者提供方便的、自定义的一些用法。
以下是本次笔记的目录列表:
- db_table
- get_latest_by
- managed
- ordering
1、db_table
一般如果我们创建 model 的时候不指定表名,系统在 makemigration 和 migrate 的时候会默认给我们添加表名。
规则是:app_name + "_" + model_name 的小写。
比如一个 model 为 TestTableName,放在 blog 这个 application 下,那么在迁移的时候,数据库表名则是:blog_testtablename。
注意: 上述情况使用的数据库是 oracle,且表名过长,则会因为 oracle 有一个表名长度的限制,会截取表名的长度。
而如果我们在 Meta 里使用 db_table 参数,则可以直接指定表名,且无视 application 名称前缀的规定。
以下是使用示例:
class TestModel(models.Model):
pass
class Meta:
db_table = 'test_table'
那么在执行 migration 的时候,系统会为这个 model 创建表名为 test_table 的表。
以上也是 Meta 使用的方式。
2、get_latest_by
指定 latest() 函数默认使用的字段。
先来介绍一下 latest() 函数,这个函数的使用方法后面会介绍,有一种用法:TestModel.objects.latest('field_name'),这样通过指定字段名称,系统会返回 TestModel 按照字段名为 field_name 排序的最新的一条数据。
而如果我们在 Meta 里指定了这个参数,那么我们就就可以在使用上述方法的时候不用指定字段名,按照我们在 Meta 里指定的字段名来排序返回最新的一条,比如在 Blog model里我们这样指定:
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
class Meta:
get_latest_by = "name"
那么当我们使用
Blog.objects.latest()
系统就会获取按照 name 字段来排序,取最后一条数据,这个就等价于:
Blog.objects.order_by('name').last()
如果在 Meta 中不指定 get_latest_by 参数,那么就会按照 id 返回最后一条数据。
注意: 表里需要有数据,否则会报错。
3、managed
该参数不设置的时候,默认为 True。
如果为 True,那么对这个 model 的每次更改,都会在 makemigrations 的时候被检测到。
这个字段如果为 False,表示 Django 在 makemigrations 的时候会忽略检测这张表,常用在仅用于系统查询的表。
用法如下:
class Blog(models.Model):
pass
class Meta:
managed = True
4、ordering
返回数据的默认字段排序。
比如 Blog model,如果我们没有在 Meta 里设置 ordering 的话,当我们使用 Blog 筛选数据的时候,会默认按照 id 正序来返回数据,如果我们在 Meta 里设置了 ordering 这个参数,那么当我们在筛选的时候不使用 order_by() 参数,则会按照我们在 ordering 里设置的字段来排序。
比如,当我们设置:
class Blog(models.Model):
pass
class Meta:
ordering = ["name"]
设置ordering 为 ["name"] 之后,Blog.objects.first() 返回的第一条数据,就是按照 name 进行正序排序之后的第一条。
如果想倒序排序,在字段名前加上 '-' 减号即可:ordering = ["-name"]
如果想按照多字段排序:ordering = ["name", "tagline"]
以上就是本篇笔记的全部内容,接下来几篇笔记中将逐步介绍 Django 的 model 在筛选中的一些用法,比如 filter,exclude,alias,values 等。
本文首发于本人微信公众号:Django笔记。
原文链接:Django笔记八之model中Meta参数的使用
如果想获取更多相关文章,可扫码关注阅读:

Django笔记八之model中Meta参数的使用的更多相关文章
- Django model 中meta options之 abstract
当abstract=True时,这个model就变成了abstrct base class,那这个基类有什么特性呢? 当某一model中设置了abstract=True时,就会使该model中的字段都 ...
- Django model 中meta options
之前学了abstract,这是后续的一些options app_label: app_label的作用是:如果一个model定义不在INSTALLED_APPS中,那么此时就需要声明,这个model的 ...
- Mybatis笔记八:MyBatis中#{}和${}的区别
先给大家介绍下MyBatis中#{}和${}的区别,具体介绍如下: 1. $将传入的数据直接显示生成在sql中 2. #方式能够很大程度防止sql注入. 3.$方式无法防止Sql注入. 4.$方式一般 ...
- (八)Struts2中的参数封装
一.静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变. 例子: (1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数 public class User exten ...
- MYSQL初级学习笔记八:MySQL中常用的函数!(视频序号:初级_45-50)
知识点十:MySQL中的函数(45-50) 数学函数: 名称 描述 CEIL() 进一取整 FLOOR() 舍一取整 MOD 取余数(取摸) POWER() 幂运算 ROUND() 四舍五入 TRUN ...
- scrapy的request的meta参数是什么意思?
作者:乌尔班链接:https://www.zhihu.com/question/54773510/answer/146971644来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Django model 中的 class Meta 详解
Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...
- Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法
Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...
- Django(十八)Model操作补充
参考博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 1. 创建类 class UserInfo(model.Model): age = ...
- Django model 中的字段解释
Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需 ...
随机推荐
- QT搭建Ffmpeg开发环境gcc版本
1 先安装qt 解压ffmpeg包 2打开qt创建工程 3 导入头文件和库文件 这里一定要注意gcc版本和库的版本一定要一致 4 添加一下简单的源代码 1 #include <libavcode ...
- 如何为linux kernel贡献代码
参考: Linux内核文档:<如何让你的改动进入内核> - 广漠飘羽 - 博客园 提交内核补丁到Linux社区的步骤 - 广漠飘羽 - 博客园 建议: 内容具有时效性,需要阅读最新版本的同 ...
- withRouter
withRouter 可以加工一般组件,让一般组件具备路由组件所特有的api,比如this.props.history withRouter的返回值是一个新组件 import {withRouter} ...
- element-ui switch
<el-tooltip :content="'Switch value: ' + value" placement="top"> <el-sw ...
- expected expression before')'token
如上图所示,今天遇到的一个编译问题,明明用法跟其他地方的一摸一样,在主程序里编译就没问题,动态库里死活都编译不过去,可把我折磨死了,最后没办法,只能请教大佬,大佬过来几分钟就找到了问题,真正出错的地方 ...
- python 如何实现多线程
今天本来打算学习学习多进程的,但是由于我现在的电脑没有Linux系统,无法通过Linux系统编辑一些多进程的程序,因此我打算从多线程入手. 多线程 我们的程序一般都是多任务的,如果你没有好好的利用好, ...
- poi读取Excel文件,数字变成科学计数法及数字自动带上“.0”的处理办法
解决poi解析excel遇到数值类型科学计数问题 NumberFormat nf = NumberFormat.getInstance();HSSFCell cell= hssfRow.getCell ...
- 关于css在html的三种使用方式
关于css在html的三种使用方式 1.内联样式(直接在html里面使用style) eg:<h1 style="color:skyblue">这是一个测试标题< ...
- redis缓存lua脚本过多导致内存占用很多问题
现象 生产某集群各节点已使用内存比较大,在清理了大量业务无用数据后,节点已使用内存却未下降. 排查与分析 通过info memory命令查看,内存碎片率略高,但是对某个主节点新添加的从节点内存使用依然 ...
- CSS选择艺术以及CSS文本样式
CSS选择的艺术1.css规则由两部分构成:选择器,声明(声明由属性和值构成且末尾跟一个分号)2.css注释:/*--*/3.CSS样式的引用(1)行内样式(内联样式)例如:<p style=& ...