Django Meta元数据类属性解析

Model 是 Django ORM 的核心,它有许多特性,比如我们提到过的模型类继承,还有未讲到过的的元数据。每个 Model 都是一个 Python 类,且通常会包含四个部分,它们分别如下:

继承自 django.db.model.Model;

Model 元数据声明;

Filed类型字段;

魔术方法__str__

除了元数据以外,其他三个部分我们在前面的章节都做了相应的介绍,在本节将详细讲解元数据 Meta 类属性。

1. 初识Meta内部类

每个模型类(Model)下都有一个子类 Meta,这个子类就是定义元数据的地方。Meta 类封装了一些数据库的信息,称之为 Model 的元数据。Django 会将 Meta 中的元数据选项定义附加到 Model 中。常见的元数据定义有 db_table(数据表名称)、abstract(抽象类) 、ordering(字段排序) 等,Meta 作为内部类,它定义的元数据可以让admin 管理后台对人类更加友好,数据的可读性更高。

Meta 定义的元数据相当于 Model 的配置信息,所以我们可以根据自己的需求进行选择性的添加。当没有需要的时候也可以不定义 Meta,这个时候 Django 会应用默认的 Meta 元数据。

2. Meta类元数据

通过上面的介绍我们知道 Meta 类的作用就是用于定义 Model 的元数据,即不属于 Model 的字段,但是可以用来标识字段一些属性,下面我们介绍 Meta 定义的常见元数据以及如何在 Model 中使用它们。

1) abstract

一个布尔类型的变量。这个属性是定义当前的模型是不是一个抽象类。所谓抽象类是不会对应数据库表的。一般我们用它来归纳一些公共属性字段,然后继承它的子类可以继承这些字段。如果 abstract = True 这个 model 就是一个抽象类。

2) ordering

用于执行获取对象列表时的排序规则。它是一个字符串的列表或元组对象,它的使用格式是由代表字段的字符串和一个表明降序的’-‘构成。当字段名前面没有’-‘时,将默认使用升序排列。使用’?'将会随机排列。示例如下所示:

ordering=["add_time"] #按照升序排序
ordering=["-add_time"]#按照降序
ordering=["?add_time"]#随机排序
#同时指定多个字段来进行排序
ordering=['add_time','-last_login_time']#先按升序,在按降序

3) verbose_name_plural

这个元数据主要用在管理后台的展示上,verbose_name_plural 是模型类的复数名 。如果不设置的话,Django 会使用小写的模型名作为默认值,并且在结尾加上 s。通过此项元数据设置名字可以去掉 s。

4) db_table

这个字段用于指定数据表的名称,通常没有特别需求,将按照 Django 默认的规则生成 Model 对应的数据库表名。

#定义该model在数据库中的表名称db_table = 'Students'
#使用自定义的表名,可以通过以下属性table_name = 'my_owner_table'

5) app_lable

这个选项只在一种使用情形,就是你的模型不在默认的应用程序包下的 models.py 文件中,这时候需要指定你这个模型是哪个应用程序的 app_label = ‘app_name’。

6) managed

它是一个布尔类型的变量,默认为 Ture,代表 Django 会管理数据的生命周期,即利用 Django 提供的 syncdb 和 reset 命令可以完成创建和删除数据表。如果为 False,则不会对此模型执行数据库表创建或删除操作。比如数据表之间存在 ManyToMany 的关系,在指定为 managed=False 的情况下,Django 不会自动创建中间表,需要我们自己手动创建。

7) indexs

它是一个列表类型的元数据项,用来定义 Model 的索引,列表中的每一个元素都是 Index 类型的实例。

Index 引自 django.db.models.indexes.Index

8) default_permissions

Django 默认会给每一个定义的 Model 设置三个权限即添加、更改、删除,它使用格式:default_permissions=('add','change','delete','view')

9) permissions

除了 Django 默认给 Model 添加的三个权限之外,还可以通过 permisssions 给 Model 添加额外的权限。不过 permissions 是一个包含二元组的元组或者列表,所以使用时应该注意格式,即 permissions=[(权限代码,权限名称)],示例如下所示:

permissions = [(have_read_permission', '有读的权限')]

10) unique_together

这个选项用于下面情形:当你需要通过两个字段保持唯一性时使用。比如用户的姓名(name)和 身份证号码(ID number)两者的组合必须是唯一的,那么需要这样设置:

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

一个 ManyToManyField 不能包含在 unique_together 中。如果你需要验证 ManyToManyField 字段的唯一验证,尝试使用 through 属性进行关联。

11) proxy

默认值为为 False, 如果设置成 Ture,则表示为基类、父类的代理模型。这个选项在后续章节还会进行相关介绍,它的主要作用就是创建父模型的代理模型。

12) db_tablespace

表空间,用于优化数据库性能,常用于 Oracle、PostgerSQL 数据库。MySQL 数据库不支持表空间,所以当数据存储后端数据库不支持的时候,Django 会在自动忽略这个元数据选项。

13) get_latest_by

指定一个 DateField 或者 DateTimeField 字段的名字,即 model 的属性名字。使用示例如下:

get_latest_by = "order_date"

这个设置让你在使用模型管理器的 lastest() 方法时,默认使用order_date指定字段来排序。

14) order_with_respect_to

这个选项一般用于多对多的关系中,它指向一个关联对象并将该对象进行排序,使用元数据项后你会得到一个 get_xxx_order() 和set_xxx_order() 的方法,通过它们你可以设置或者得到排序的对象。

Django Meta元数据类属性解析相关推荐

  1. Django:Meta元数据类属性解析

    Model 是 Django ORM 的核心,它有许多特性,比如我们提到过的模型类继承,还有未讲到过的的元数据.每个 Model 都是一个 Python 类,且通常会包含四个部分,它们分别如下: 继承 ...

  2. Django中模型类 属性-学习笔记

    定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模型只能 ...

  3. python模型的属性是什么_python – Django:为什么Django模型字段的类属性?

    不,原因与此相同: >>> class Foo(object): ... bar = 'Foo attribute' ... >>> f = Foo() >& ...

  4. Django DRF 序列化类

    文章目录 1. 序列化类 Serializer 1.1 Serializer 基本使用 1.2 定义序列化类 1.3 创建 Serializer 对象 1.4 序列化 1.5 反序列化 1.6 钩子函 ...

  5. django定义模型类-14

    目录 1. 定义 字段类型 约束类型 django的模型类定义在应用下的 models.py 文件中. 模型类继承自 django.db.models 包下的 Model 类. 新创建应用 book ...

  6. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  7. 元数据核心架构解析(PPT)

    本文为普元大数据产品线产品管理部总监吴艳伟在云计算架构设计群的微课堂分享.如需加入微信群参与微课堂.架构设计与讨论直播,请直接回复此公众号:"加群 姓名 公司 职位 微信号". 大 ...

  8. Django 定义模型类(八)

    定义模型类 模型类被定义在"应用/models.py"文件中. 模型类必须继承自Model类,位于包django.db.models中 1 . 定义 创建应用booktest,在m ...

  9. python学习第6天---django框架---模型类及数据库操作

    python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...

最新文章

  1. 给每个函数写一个记录日志的功能.
  2. [问答]-ARM文档中的†和‡的含义
  3. php保存设置,php如何实现编辑和保存文件?
  4. 机器学习与分布式机器学习_我将如何再次开始学习机器学习(3年以上)
  5. vue项目,webpack中配置src路径别名及使用
  6. 50行以上c语言程序代码,C语言非常简单的字符统计程序50行
  7. 【OpenCV 例程200篇】30. 图像的缩放(cv2.resize)
  8. Linux——批量查找替换方法(VIM和sed)
  9. 案例分享|数据可视化下的驱动业务增长
  10. 转:理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
  11. App云端打包失败常见问题汇总
  12. 优化算法 - Adadelta
  13. 用PYTHON画谢尔宾斯基三角形(代码可复制)
  14. 解决虚拟机启动失败或进入应急模式的问题
  15. paint.net ps证件照背景色
  16. 思维的误区:忽视沉默的大多数
  17. 零基础学习CAD机械软件:02课CAD软件的启动和退出
  18. 计算机之父的童年故事教案,《“计算机之父”的童年故事》教学设计
  19. HDU 5745 La Vie en rose(DP+bitset优化)
  20. oracle 倒库详细步骤,详细的“倒车入库”步骤来了!一图一解析,照着做考试轻松一把过...

热门文章

  1. CSS阴影的几种形式
  2. 仪征警方“猎狐行动”取得重大战果一外逃越南嫌疑人落网
  3. centos6.5环境openldap实战之ldap配置详解及web管理工具lam(ldap-account-manager)使用详解
  4. 币信(BXIN)创始人唐仪(Tony Tong):币信(BXIN)坚持合规为主
  5. AttributeError: module ‘cv2‘ has no attribute ‘CV_AA‘
  6. “泛在电力物联网”究竟是什么?
  7. 2021年安全员-A证考试题库及安全员-A证试题及解析
  8. 技术管理实战学习笔记(一)
  9. crackme160 Acid_burn.exe
  10. 功能强大的远程终端神器MobaXterm