模型
模型是数据独有的限定性源。它包括所存储数据的必要的字段及数据行为。总体上说,每个模型映射到唯一的一张数据库表上。
基本要点:
每个模型都是一个Python类,这个类是django.db.models.Model的子类。
模型类的每个属性代表了一个数据库字段。
通过以上所提到的两点,Django为我们提供了一整套自动生成的数据库存取API;查看执行查询(Making queries)。
例子:
这个例子定义了一个Person模型,它有first_name和last_name两个字段:
from django.db import models
class Person(models.Model):
last_name = models.CharField(max_length=30)
first_name和last_name是模型的两个字段。每个字段被指定为一个类属性,每个属性映射为一个数据库表的列。
上面的Person模型将会生成如下所示的数据库表:
CREATE TABLE myapp_person (
);
需要注意的一些知识点如下:
数据表的表名myapp_person是自动从模型元数据中衍生出来的,当然也可以自定义。查看表名以了解更多细节... …
字段id是自动添加的,当然这个特性也可以自定义。查看自动主键字段。
这个例子中的SQL命令CREATE TABLE采用的是PostgreSQL语法,需要指出的是,Django根据settings文件中指定的数据库后台来确定采用哪种一致的SQL语法。
使用模型
一旦完成了模型的定义,下一步就需要告诉Django要使用这些模型。要做到这一点,需要编辑settings文件,更改INSTALLED_APPS项,将包括models.py的模块名添加进去。
例如,假设mysite.myapp.models模块包含应用程序的模型(应用程序的包结构由脚本命令manage.py startapp生成),INSTALLED_APPS看起来就像这样(部分地):
INSTALLED_APPS = (
)
在INSTALLED_APPS中添加新的应用程序之后,一定要确保运行manage.py syncdb命令。
字段
模型的最重要的部分,也即非可或缺的部分当属数据库中要定义的字段的列表。字段由类的属性指定。
例如:
class Musician(models.Model):
class Album(models.Model):
num_stars = models.IntegerField()
字段类型
模型中的每一个字段须是相应的字段类(Field class)的一个实例。Django的字段类(Field class)决定了:
数据库中列的类型(例如,INTEGER,VARCHAR)。
在Django的后台应用程序(admin)界面中要使用什么部件(例如,<input type=”text”>,<select>)。
在Django的后台应用程序(admin)以及自动生成的表单中的基本验证需求。
Django附带有十几种内建字段类型;你可以在模型字段参考中查看完整列表。如果内建字段类型无法满足需要,你可以很轻松地构建自己的字段类型;可以查看自定义模型字段一节。
字段选项
每一个字段都有一些相应的字段参数(相应文档可以查看模型字段参考)。例如,CharField(及其子类)使用max_length参数指定对应的用于保存数据的数据库字段VARCHAR的字段长度。
一些公共参数适用于所有的字段类型。它们都是可选的。它们的完整解释可以参考手册中找到,以下是一些最常使用的参数的大致介绍:
null
如果null的值为True,Django会以NULL在数据库保存空值。它的默认值为False。
blank
如果blank的值为True,相应数据库字段将允许值为空。它的默认值为False。
注意blank和null是有区别的。Null是纯粹的数据库相关的选项,而blank是验证相关的选项。如果一个字段设置了选项blank=True,在Django的admin应用程序中将允许该字段输入空值。如果一个字段设置了选项blank=False,该字段将为必填字段。
Choices
一个二元的可迭代值(列表或元组)可以作为一个字段的可选择项。如果设置了该选项,Django的admin应用程序将会以选择框取代标准的文本输入框,并且输入仅限于所定的选项。
一个choices列表看起来就像这样:
YEAR_IN_SCHOOL_CHOICES = (
)
每一个元组中的第一个元素的值表示要在数据库中存储的值。第二个元素的值为在admin应用程序界面上显示的内容,或显示在模型选择字段(ModelChoiceField)中。对于一个模型对象的实例来说,choices字段的第二个元素的值可以通过get_FOO_display方法来获取。例如:
from django.db import models
class Person(models.Model):
gender = models.CharField(max_length=2, choices=GENDER_CHOICES)
>>> p = Person(name="Fred Flinstone", gender="M")
>>> p.save()
>>> p.gender
u'M'
>>> p.get_gender_display()
u'Male'
default
表示字段的默认值。可以是值,也可以是可调用对象。如果默认值是可调用对象,那么每创建一个新实例,它都会被调用一次。
help_text
显示在admin表单下的相应字段的额外的“帮助”文本。即使对象没有使用admin表单,它对于文档清晰也是有帮助的。
primary_key
如果primary_key的值为True,该字段将是模型的主键。
如果在模型中你没有为任何一个字段指定primary_key=True,Django将自动添加一个IntegerField类型的字段用于主键,所以为字段设置primary_key=True选项不是必需的,除非你想覆盖掉默认行为。更多细节,请查看自动主键字段一节(Automatic primary key fields)。
unique
如果unique的值为True,这个字段的值在数据库表中须是唯一的。
再次重申,这些仅仅是常用字段选项的简单介绍。完整的描述可在查看通用模型字段选项参考(common model field option reference)。
自动主键字段(Automatic primary key fields)
默认地,Django为每一个模型提供了以下字段:
id = models.AutoField(primary_key=True)
这是一个值自动增加的主键。
如果你想指定一个自定义主键,仅需在相应字段中指定primary_key=True即可。如果Django看到你明确地指定了Field.primary_key,它将不再自动地添加id列。
每一个模型都需要且仅需要一个字段有primary_key=True这个选项。
详细字段名(Verbose field names)
每一个字段类型,除ForeignKey,ManyToManyField和OneToOneField之外,带有一个可选的处于最前面的位置参数--- ---详细名称。如果没有提供详细名称参数,Django将会采用字段的属性名,并且必要时转换下划线为空格。
下例中,详细名为“Person’s first name”:
first_name = models.CharField("Person's first name", max_length=30)
下例中,详细名为“first name”:
first_name = models.CharField(max_length=30)
ForeignKey,ManyToManyField和OneToOneField字段的第一个参考必须为一个模型类,所以它必须使用关键字参数:
poll = models.ForeignKey(Poll, verbose_name="the related poll")
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(Place, verbose_name="related place")
按照惯例,详细字段名的第一个字母不必大写。Django将会在需要时自动转换大小写