Django model class Meta原理解析

通过一个内嵌类 "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".

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

(0)

相关推荐

  • Django获取model中的字段名和字段的verbose_name方式

    定义模型: class Game(models.Model): name = models.CharField(u'游戏名称',max_length=30) gameid = models.CharField(u'游戏id',max_length=20) def __str__(self): return self.name 获取字段名和verbose_name: from django.apps import apps def getmodelfield(appname,modelname):

  • 通过代码简单了解django model序列化作用

    一直对使用DRF的了解停留在一知半解的状态,今天在实际操作中,感受到了DRF带来的方便 Django工程,其中两个model定义如下: AutomationHeadRaw: class AutomationHeadRaw(models.Model): """ 测试用例的请求的json形式参数 """ id = models.AutoField(primary_key=True) automationCaseApi = models.OneToOn

  • Mysql数据库反向生成Django里面的models指令方式

    python manage.py inspectdb 或 python manage.py inspect > app/models.py 补充知识:Django框架MySQL数据库到models模型的映射关系 一.前言 我的数据库已经用MySQL Workbench设计好了,也插入了一些测试数据,现在开始在Django中设计models模型.本以为顺风顺水,没想到也遇到一些bug,现在记录一下踩坑填坑过程. 二.设计models模型 1. 如果数据库中表的数量比较多,可以先导出,然后查看对应表

  • Django model.py表单设置默认值允许为空的操作

    blank=True 默认值为blank=Flase,表示默认不允许为空, blank=True admin级别可以为空 null=True 默认值为null=Flase,表示默认不允许为空 null=True 数据库级别可以为空 补充知识:Django中models.py字段选项null和blank的区别和使用 1.null 如果null=True,数据库中空值储存为NULL,默认为False. 2.blank 如果blank=True,则允许字段为空.默认为False. 需要注意的是,这不同

  • Django Model层F,Q对象和聚合函数原理解析

    一.F对象: 作用:用于处理类属性(即model的某个列数据),类属性之间的比较. 使用之前需要先导入: from django.db.models import F 例1:查询图书阅读量大于评论量图书信息. BookInfo.objects.filter(bread__gt=F('bcomment')) **例2:**查询图书 阅读量大于2倍评论 量图书信息. BookInfo.objects.filter(bread__gt=F('bcomment')*2) 二.Q对象: 作用:用于查询时条

  • Django基于Models定制Admin后台实现过程解析

    简介 效果预览 Django自带一个Admin后台, 支持用户创建,权限配置和所有模型的增删改查功能, 只需要一些简单的配置就可快速得到一个开箱可用的后台管理系统 操作步骤 1. 更改设置,使用中文/亚洲时区 修改项目下django_shop目录下的settings.py文件 修改以下三行 LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_L10N = False 添加以下两行, 已更改时间显示格式 DATETIME_FORMAT

  • Django Model中字段(field)的各种选项说明

    字段与选项 CharField() 字符字段 max_length = xxx or None # 必选项 blank = True 和 default = '' # 如果不是必填项,可以设置 unique = True # 如果想要使其唯一,比如用于username,可以设置 choices = xxx_CHOICES # 如果有choice选项,可以设置 TextField() 文本字段 max_length = xxx blank = True 和 default = '' # 如果不是必

  • Django model class Meta原理解析

    通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharField(maxlength=30) class Meta: # ... Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等. 下面是所有可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta 到你的 model 完全

  • Django框架 信号调度原理解析

    Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Django内置信号 Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_delet

  • Django中ORM基本应用与原理解析

    目录 1.ORM构建数据表 2.数据迁移 3.Model相关的概念与使用方法 Model的组成部分 Meta元数据类属性说明 Field的通用字段选项 基础字段类型 关系字段类型 多对一 一对一 多对多关系类型 1.ORM构建数据表 由于每一个数据表对应一个Model定义,每一个Model都是一个Python类,所以,Model之间是可以继承的.Django规定,所有的Model都必须继承自django.db.models.Model Model中的所有字段都是django.db.models.

  • Java 并发编程:volatile的使用及其原理解析

    Java并发编程系列[未完]: •Java 并发编程:核心理论 •Java并发编程:Synchronized及其实现原理 •Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) •Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) •Java 并发编程:volatile的使用及其原理 一.volatile的作用 在<Java并发编程:核心理论>一文中,我们已经提到过可见性.有序性及原子性问题,通常情况下我们可以通过Synchroniz

  • Django model select的多种用法详解

    <Django model update的各种用法介绍>文章介绍了Django model的各种update操作,这篇文章就是她的姊妹篇,详细介绍Django model select的用法,配以对应MySQL的查询语句,理解起来更轻松. 基本操作 # 获取所有数据,对应SQL:select * from User User.objects.all() # 匹配,对应SQL:select * from User where name = '运维咖啡吧' User.objects.filter(

  • 在Django model中设置多个字段联合唯一约束的实例

    使用Django中遇到这样一个需求,对一个表的几个字段做 联合唯一索引,例如学生表中 姓名和班级 2个字段在一起表示一个唯一记录. Django中model部分的写法, 参见 unique-together 部分文档. class MyModel(models.Model): field1 = models.CharField(max_length=50) field2 = models.CharField(max_length=50) class Meta: unique_together =

  • Django model 中设置联合约束和联合索引的方法

    在Django model中对一张表的几个字段进行联合约束和联合索引,例如在购物车表中,登录的用户和商品两个字段在一起表示唯一记录. 举个栗子: Django model中购物车表 class Cart(models.Model): user = models.ForeignKey( MyUser, verbose_name="用户" ) goods = models.ForeignKey( Goods, verbose_name="商品" ) num = mode

  • python django model联合主键的例子

    今天,在家试试django的model的设置,如何设置的联合主键,我经过查资料和实践,把结果记录如下: 例如: class user(Model): id=AutoField(primary_key=True) name = CharField(max_length=30) age =IntegerField() class role(Model): id=AutoField(primary_key=True) name=CharField(max_length=10) 这是两个model有一个

  • Django model序列化为json的方法示例

    本文环境 Python 3.6.5 Django 2.0.4 fix(2018.5.19):最近得知Django 的model基类需要声明为abstract,故在原来的代码加入abstract声明,以免误导 在Django中,关于如何将model类序列化为json,一般的话有两a器 将model类转为字典,再使用json库的dumps方法转为json 第一种方法就不多讲了,直接去看官方文档就好啦 一般来说,官方提供的方法应该都是比较好用和稳定的,然而,使用官方的序列化器却问题不少: 格式丑陋,格

  • Django model反向关联名称的方法

    如果你在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反向名称.但在抽象基类上这样做就会引发一个很严重的问题.因为 Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括related_name). 当你在(且仅在)抽象基类中使用 related_name 时,如果想绕过这个问题,名称中就要包含'%(app_label)s'和 '%(class)s'. '%(class)s

随机推荐