模型是关于您的数据的单一的、确定的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型映射到单个数据库表。
基础知识:
- 每个模型都是一个 Python 的类,这些类继承
django.db.models.Model
- 模型类的每个属性都相当于一个数据库的字段。
- 综上诉说,Django 给你一个自动生成访问数据库的 API;请参阅 Making queries。
简单的例子
这个样例模型定义了一个 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)
firstname 和 lastname 是模型的字段。每个字段都被指定为class属性,每个属性映射到数据库列。
上面的Person模型会创建一个这样的数据库表:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
一些技术上的说明:
- 该表的名称 “myapp_person” 是自动从某些模型元数据中派生出来,但可以被改写。有关更多详细信息,请参阅:表命名。
- 一个
id
字段会被自动添加,但是这种行为可以被改写。请参阅:默认主键字段。 - The
CREATE TABLE
SQL in this example is formatted using PostgreSQL syntax, but it’s worth noting Django uses SQL tailored to the database backend specified in your settings file.
使用模型
一旦你定义了你的模型,你需要告诉Django你将会使用这些模型。通过编辑你的设置文件和改变 INSTALLED_APPS 设置来添加包含你的 models.py 的模块的名称来实现这一点。
例如,如果您的应用程序的模型存在于模块myapp.models(为应用程序创建的包结构 manage.py startapp 脚本),**INSTALLED_APPS 应该阅读部分内容:
INSTALLED_APPS = [
#...
'myapp',
#...
]
当你添加新的APP到 INSTALLED_APPS
, 去报先执行manage.py migrate
,有时候需要限制性 manage.py makemigrations
.
字段
模型中最重要的部分——以及模型中唯一需要的部分——是它定义的数据库字段列表。字段由class属性指定。注意不要选择与模型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()
字段类型
模型中的每个字段都应该是适当字段类的一个实例。Django使用field类类型来确定一些事情:
- 列类型,它告诉数据库要存储什么样的数据(例如INTEGER、VARCHAR、TEXT)。
- 默认的HTML小部件在呈现表单字段时使用(例如:,)。
- 在Django的管理员和自动生成的表单中使用的最小验证需求。
Django配备了数十种内置的字段类型;您可以在模型字段引用中找到完整的列表。如果Django的内置函数不奏效,您可以轻松地编写自己的字段;参见编写定制模型字段。
字段选项
每个字段都接受一组特定于字段的参数(在模型字段引用中记录)。例如,CharField(及其子类)需要一个 max_length 参数,该参数指定用于存储数据的VARCHAR 数据库字段的大小。
对于所有字段类型,也有一组通用的参数。都是可选的。它们在参考文献中得到了充分的解释,但这里有一个对最常用的解释的快速总结:
null
如果是True,Django会将空置的值存储为 NULL。默认是False。
blank
如果是True,这个字段是空白的。默认是False。
注意,这与null不同。null与数据库相关,而blank则是与验证相关的。如果一个字段有 blank=True ,表单验证就允许输入空值。如果一个字段有blank=False ,则需要字段。
choices
2元组的可迭代(例如,列表或元组),用作此字段的选项。如果给出了这个,则默认表单小部件将是一个选择框而不是标准文本字段,并将限制对给定选项的选择。
选择列表如下:
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)
每个元组中的第一个元素是储存在数据库中的值。第二个元素由field的form小部件显示。
给定一个模型实例,可以使用