Django中文文档-模型Models(二):Meta选项、模型属性、模型方法
元数据(Meta)选项
使用内部的class Meta 定义模型的元数据,例如:
from django.db import models class Ox(models.Model):
horn_length = models.IntegerField() class Meta:
ordering = ["horn_length"]
verbose_name_plural = "oxen"
模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据库表名(db_table)或者人类可读的单复数名称(verbose_name 和verbose_name_plural)。在模型中添加class Meta是完全可选,所有选项都不是必须的。
所有元选项的完整列表可以在模型选项参考找到。
模型的属性
- objects
- 模型最重要的属性是Manager。它是Django 模型进行数据库查询操作的接口,并用于从数据库获取实例。如果没有自定义Manager,则默认的名称为objects。Managers 只能通过模型类访问,而不能通过模型实例访问。
模型的方法
可以在模型上自定义方法来给你的对象添加自定义的“底层”功能。相对于Manager 方法用于“表范围”的事务,模型方法则着眼于特定的模型实例。
这是一项非常有价值的技术,让业务逻辑位于同一个地方 —— 模型中。
例如,下面的模型具有一些自定义的方法:
from django.db import models class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
birth_date = models.DateField() def baby_boomer_status(self):
"Returns the person's baby-boomer status."
import datetime
if self.birth_date < datetime.date(1945, 8, 1):
return "Pre-boomer"
elif self.birth_date < datetime.date(1965, 1, 1):
return "Baby boomer"
else:
return "Post-boomer" def _get_full_name(self):
"Returns the person's full name."
return '%s %s' % (self.first_name, self.last_name)
full_name = property(_get_full_name)
这个例子中的最后一个方法是一个属性。
模型实例参考 中有每个模型自带方法的完整列表。它们大部分都可以被覆盖 —— 参见下文覆盖模型预定义的方法 —— 但是有些方法你会始终想要定义:
__str__() (Python 3)
一个Python的魔术方法(magic method),返回对象的字符串表达式(unicode格式)当模型实例需要强制转换并显示为普通的字符串时,Python 和Django 将使用这个方法。最突出的用法是在交互式控制台或者管理站点显示一个对象。
你会经常需要定义这个方法;默认方法返回的内容没多大用处。
__unicode__() (Python 2)
-
Python 2中 等同于 __str__().
get_absolute_url()
-
它告诉Django 如何计算一个对象的URL。Django 在它的管理站点中使用到这个方法,在其它任何需要计算一个对象的URL 时也将用到。
任何具有唯一标识自己的URL 的对象都应该定义这个方法。
重写预定义的模型方法
还有另外一部分封装数据库行为的模型方法,我们有时可能也需要自定义它们。尤其是save() 和delete() 的工作方式。
你可以自由覆盖这些方法(和其它任何模型方法)来改变它们的行为。
覆盖内建模型方法的一个典型的使用场景是,你想在保存一个对象时做一些其它事情。例如(参见save() 中关于它接收的参数的文档):
from django.db import models class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() def save(self, *args, **kwargs):
do_something()
super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
do_something_else()
你还可以阻止保存:
from django.db import models class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() def save(self, *args, **kwargs):
if self.name == "Yoko Ono's blog":
return # Yoko shall never have her own blog!
else:
super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
必须要记住调用超类的方法—— super(Blog, self).save(*args, **kwargs) —— 来确保对象被保存到数据库中。如果你忘记调用超类的这个方法,默认的行为将不会实行并且数据库不会有任何改变。
还要记住传递参数给这个模型方法 —— 即*args, **kwargs。 Django 未来将一直会扩展内建模型方法的功能并添加新的参数。如果在你的方法定义中使用*args, **kwargs,将保证你的代码自动支持这些新的参数。
注意:
批量操作中被覆盖的模型方法不会被调用
注意,当使用查询集批量删除对象时,将不会为每个对象调用delete() 方法。为确保自定义的删除逻辑得到执行,你可以使用pre_delete 和/或post_delete 信号。
不幸的是,当批量creating 或updating 对象时没有变通方法,因为不会调用save()、pre_save和 post_save。
执行自定义的SQL
另外一个常见的需求是在模型方法和模块级别的方法中编写自定义的SQL 语句。关于使用原始SQL 语句的更多细节,参见使用原始 SQL的文档。
Django中文文档-模型Models(二):Meta选项、模型属性、模型方法的更多相关文章
- 推荐Python、Django中文文档地址
协作翻译网:http://usyiyi.cn/ 老牌的Python中文社区:http://woodpecker.org.cn/ The Django Book2.0中文版:http://djangob ...
- talib 中文文档(十二):Pattern Recognition Functions K线模式识别,形态识别
Pattern Recognition Functions K线模式识别,形态识别 CDL2CROWS - Two Crows 函数名:CDL2CROWS 名称:Two Crows 两只乌鸦 简介:三 ...
- Django 中文文档地址
http://djangobook.py3k.cn/2.0/ MK一下
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...
- Django 1.10中文文档-执行查询
Django 1.10中文文档: https://github.com/jhao104/django-chinese-doc 只要创建好 数据模型, Django 会自动为生成一套数据库抽象的API, ...
- Django 1.10中文文档-聚合
Django 数据库抽象API 描述了使用Django 查询来增删查改单个对象的方法. 然而,有时候你要获取的值需要根据一组对象聚合后才能得到. 这个主题指南描述了如何使用Django的查询来生成和返 ...
- Django 1.10中文文档-第一个应用Part5-测试
本教程上接教程Part4. 前面已经建立一个网页投票应用,现在将为它创建一些自动化测试. 自动化测试简介 什么是自动化测试 测试是检查你的代码是否正常运行的行为.测试也分为不同的级别.有些测试可能是用 ...
- Django 1.10中文文档-第一个应用Part3-视图和模板
本教程上接Django 1.10中文文档-第一个应用Part2-模型和管理站点.我们将继续开发网页投票这个应用,主要讲如何创建一个对用户开放的界面. 概览 视图是Django应用中的一“类”网页,它通 ...
- Django 1.10中文文档-第一个应用Part2-模型和管理站点
本教程继续Part1.我们将设置数据库,创建您的第一个模型,并快速介绍Django的自动生成的管理网站. 数据库设置 现在,编辑mysite/settings.py.它是一个用模块级别变量表示Djan ...
随机推荐
- Git轻松入门3:远程仓库篇
在第一讲中,我们有介绍过:Git是分布式版本控制系统.每个人的电脑上都有一份完整的版本库.当对项目作出了修改后,只要把修改推送给对方即可.但很有可能的情况是:两台电脑不在一个局域网内,无法互相访问:或 ...
- 最短Hamilton路径(状压dp)
最短Hamilton路径实际上就是状压dp,而且这是一道作为一个初学状压dp的我应该必做的题目 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 ...
- 【bzoj 2339】[HNOI2011]卡农(数论--排列组合+逆元+递推)
题意:从编号为 1~N 的音阶中可选任意个数组成一个音乐片段,再集合组成音乐篇章.要求一个音乐篇章中的片段不可重复,都不为空,且出现的音符的次数都是偶数个.问组成 M 个片段的音乐篇章有多少种.答案取 ...
- __getattr__,__getattribute__和__get__的区别
dir(object) 列出对象的大多数属性 getattr(object, name) 从object对象中获取name字符串指定的属性 hasattr(object, name) 如果objec ...
- SPI/QSPI通信协议详解和应用
SPi是高速全双工的串行总线,通常应用在通讯速率较高的场合. SS:从设备选择信号线,也称片选信号线 每个从设备都有一个独立的SS信号线,信号线独占主机的一个引脚,及有多少个从设备就有多少个片选信号线 ...
- CF1478-A. Nezzar and Colorful Balls
CF1478-A. Nezzar and Colorful Balls 题意: 有\(n\)个球,每个球上面都有一个数字\(a_i\),这些数字是组成的序列是非递减的.现在你要给每个球涂色,你必须保证 ...
- 浅谈Webpack模块打包工具四
Webpack 生产环境优化 生产环境和开发环境有很大的差异,生产环境只注重运行效率,开发环境主要开发效率,webpack4.0开始提出了(mode)模式的概念 针对不同的环境进行不同的配置,为不同的 ...
- XV6学习(16)Lab net: Network stack
最后一个实验了,代码在Github上. 这一个实验其实挺简单的,就是要实现网卡的e1000_transmit和e1000_recv函数.不过看以前的实验好像还要实现上层socket相关的代码,今年就只 ...
- 2.安装Helm
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-25 13:54:15 星期二 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...
- Linux系统诊断必备技能之二:日志查询常用命令详解
一.概述 日常运维工作中,排查线上环境问题,少不了去线上查日志.而使用什么命令,能快速准确地查到我们需要查找地日志信息,也是我们需要掌握的一项技能.下面介绍一下日常工作常用到的查看日志命令:tail, ...