模型是关于你的数据的唯一、确定的资料来源。它包含你所存储的数据的基本字段和行为。通常,每个模型映射到一个数据库表。
基础知识:
举个简单的例子:
下面这个示例模型定义了一个Person模型,它具有first_name和last_name两个属性。
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
first_name和last_name是Person模型的字段。每个字段被指定为一个类属性,每个属性映射到一个数据库列。
上面的Person模型将创建这样的数据库表
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
一些技术说明:
使用模型
一旦你定义好了模型,你就需要告诉Django你将使用这些模型。通过编辑你的配置文件(settings)并修改INSTALLED_APPS设置来添加包含在你的models.py中的模块的名称。
例如,如果你的应用程序的模型位于myapp.models中(由manage.py startapp命令自动创建的包结构),修改后,INSTALLED_APPS部分看上去应该是这样:
INSTALLED_APPS = [
#...
'myapp',
#...
]
当你为INSTALLED_APPS添加新应用时,一定要执行 manage.py migrate 命令,必要的时候可以先使用 manage.py makemigrations 命令生成迁移脚本。
字段
模型中最重要的部分——也是模型中唯一需要的部分是它定义的数据库字段的列表。字段由类属性指定,注意不要选择与 models API冲突的字段名称,比如clean、save或delete。
例子:
from django.db import models
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
字段类型
字段选项
每个字段都有一组特定的字段参数(在模型字段参考中有记录),例如, CharField
(及其子类)需要一个 max_length
参数,该参数用于指定VARCHAR
数据库字段在数据库中存储的字段大小。
还有一组适用于所有字段类型的通用参数,都是可选的。它们在参考文献中得到了充分的解释,但这里有一个关于最常用的参数的快速摘要:
null
如果为
True
, Django在数据库中把空值存储为
NULL
。默认为
False
.
blank
如果为 True
,则允许字段为空。默认为 False
.
请注意,这是与nul不同的。null
是纯粹与数据库相关的,而blank
是与验证相关的。如果一个字段拥有blank=True
参数,表单验证将允许一个空的值。如果字段 blank=False
,那么字段将是必须的。
choices
一个可迭代的(例如,一个列表或者元组)2元元组作为该字段的可选项, 如果是给定的, 默认表单小部件将是一个可选框,而不是一个标准的文本字段,而且可选项将被限定为给定的可选内容。
选择列表如下所示:
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)
每个tuple中的第一个元素是将存储在数据库中的值。第二个元素由字段的表单小部件显示。
给定一个模型实例,一个带有choices属性的字段的显示值可以使用get_FOO_display()
方法来访问。例如:
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)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
default
字段的默认值。这可以是一个值或一个可调用的对象。如果可调用,则每次创建新对象时都会调用它。
primary_key
如果为 True
,那么该字段将是模型的主键。
primary_key=True,
Django会自动添加一个IntegerField
来保存主键。所以你不需要在你的字段中指定primary_key=True
除非你想覆盖默认的主键行为。更多信息请参阅Automatic primary key fields。
主键字段是只读的,如果你修改现有对象上主键的值并保存,将会在原有的对象旁边创建一个新的对象。例如:
from django.db import models
class Fruit(models.Model):
name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
#待续。