Django深入学习之模型语法(model syntax)
模型是你的网站数据信息惟一的、明确的来源。它包含你所储存数据的字段定义和行为。一般地,一个模型映射着一个惟一数据库的表单(table)。
- 所有模型都是django.db.models.Model的子类。
- 模型的每个属性代表着一个数据库字段
- django会自动生成你所需要的数据库
使用模型
当你定义完你的数据模型,你得告诉Django你将使用它,你需要在setting.py中的INSTALLED_APPS中添加模型。
字段
一个模型最重要也是必须的部分 - 定义一系列的数据字段,字段由类属性来描述。注意字段名不要与模型API的一些关键字冲突,比如clean,save和delete。
字段选项
每一个字段都需要特定的字段说明选项来配套。比如CharField需要max_length来指明需要多大的空间来储存该字段。
null
如果True,Django将会在数据库中储存Null空值。默认是False。
blank
如果为真,这个字段允许为空,默认为False。
注意:blank与null的区别,null是数据库相关,而blank是数据合法性相关,如果一个字段有blank=True,表单将允许一个空值的条目,如果一个字段拥有blank=False,这个字段必须存在。
choices
一个可迭代的2个元组作为字段选项。如果存在这样的字段,默认表单窗口部件为选项枢。
例:
from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
default
字段的默认值,这可以一个值,也可以是一个可以调用的对象,比如datetime.datetime.now()。
help_text
额外“help"文本以表单部件形式显示。
primary_key
如果为True,这个字段就是这个模型的主键。如果没有特别指明主键,那么Django会自动添加一个一个IntegerField作为主键。
unique
如果为True,那么这个字段在整个表单必须惟一。
详细字段名称
除了ForeinghKey,ManyToManyField和OneToOneField,每个字段类型都可以将详细字段名称作为第一个参数。如果没有特别指明详细字段名称,Django将会会用字段名称自动创建它。
如果是ForeinghKey,ManyToManyField和OneToOneField,那么需要使用verbose_name作为关键字来指定详细字段名称。
关系
很明显,关系数据库的优势基于互相相关的数据库表单。Django提供三种常见的数据关系。多对一(many-to-one)、多对多(many-to-many)、一对一(one-to-one)。
多对一(many-to-one)
要定义一个多对一关系,使用django.db.models.ForeignKey。ForeignKey需要一个位置参数:与此模型相关的类。
多对多(many-to-many)
要定义一个多对多关系,使用ManyToManyField。ManyToManyField同样需要一个位置参数:与此模型相关的类。
一对一(one-to-one)
要定义一个一对一关系,使用OneToOne。OneToOneField同样需要一个位置参数:与此模型相关的类。
跨文件模型
模型中的字段也可以与另一个应用中的模型存在外键关系。
字段名称限制
- 字段名称不能是一个Python保留字段
- 字段名称在一行里不能有超过一个下划线
元数据选项(Meta options)
模型的元数据通过使用内联类Meta来添加,模型的元数据是那些模型中除了字段的语句。比如排序选项(ordering),数据库表单名称(db_table)等等。
模型属性
一个模型最重要的属性是Manager,它是Django模型提供的数据库查询接口,用来从数据库获取对象。如果没有定义定制的Manager,那么它的默认名称是objects。
模型方法
有两个几乎所有模型类都会乃至的方法。
__str__()(Python3)
__unicode__()(python2)
当你在交互终端或者admin界面时,上面两个方法特别有用,它们定义了,在交互终端或者admin界面模型实例如何显示的问题。
get_absolute_url()
这个方法告诉Django如何为对象计算URL。
重写预定义的模型方法
还有其它一系列封装数据库行为的模型方法,有时候需要定制。特别是常见的save()和delete()
我们能够自由定制这些模型方法。
模型类的继承
模型类的继承与普通的Python类的继承并没有什么两样。
在Django中存在3种类型的继承:
1、抽象基类
2、多表单继承
3、代理继承