(本人大学英语四级及格水平,渣渣翻译,每天翻译半小时,有不对的地方还请留言指正)
(官方文档链接:https://docs.djangoproject.com/en/2.0/topics/db/models/)
Models
Model是你数据信息的唯一,确定的来源。它包含了基础字段(fields)和存储数据时的行为。总的来说,每一个Model都匹配一个数据表。
基础:
- 每一个Model都是一个继承于
django.db.models.Model
的class - Model的每一个属性都代表着数据表中的一个字段
- Django提供了一个自动生成的数据库访问的API,参见
Making queries
.
小栗子
这个model
例子定义了一个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
都是model
的字段,并且也作为一个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
,是通过model
的metadata
自动生成的,但是可以被重写。重写方法参见:Table names
- id字段被自动添加,但是这些行为可以被重写。
参见Automatic primary key fields - 本例中的
CREATE TABLE
SQL语句使用的是PostgreSQL的语法进行格式化,但是值得注意的是Django使用的SQL语句是针对您设置文件中指定的后端数据库。
配置文件:settings file
Using models
一旦你已经创建了你的models
,你需要告诉Django
你准备去使用这些models
。把包含你model.py
的模块(module
)名称添加到配置文件(setting file
)的INSTALLED_APPS
中去,就可以使用这些model
了。
例如,如果包含model.py
的app
名称为myapp.models
,INSTALLED_APPS
应该添加如下信息(app
可以使用manage.py
的startapp
命令创建):
INSTALLED_APPS = [
#...
'myapp',
#...
]
当你往INSTALLED_APPS
中添加新app
时,一定要运行 manage.py
的migrate
命令,在运行migrate
命令前,可以选择运行manage.py
的makemigrations
命令。
Fields
一个model
中最重要的部分,也是model
中唯一需要的部分,就是它定义的一连串的数据库的字段。field
由类属性指定。值得注意的是,字段名称选取时不要选择与model 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)
#on_delete=models.CASCADE级联删除,当删除主表数据时,从表中的数据也一起删除
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
Field类型(Field types)
你model
中的每一个field,都应该选择一个合适的Field类去实例化。Django
使用field
类的类型去完成一些东西:
- 数据表列类型,它告诉数据库是什么类型的数据被存储。(例如:
INTEGER,VARCHAR,TEXT
)。 - 一个缺省的HTML微件( widget)当渲染一个form的字段时。(例如:
,
) - 在
Django
的admin
与自动生成的表单中,field
类型是最小的验证需求。
Django提供了数十种内置的字段类型;您可以在模型字段引用( model field reference
)中找到完整的列表。如果Django的内置函数不能满足你的需求的话,你也可以自己编写自己的field
。参见 Writing custom model fields.
Django
提供的内置Field
类型
__all__ = [str(x) for x in (
'AutoField', 'BLANK_CHOICE_DASH', 'BigAutoField', 'BigIntegerField',
'BinaryField', 'BooleanField', 'CharField', 'CommaSeparatedIntegerField',
'DateField', 'DateTimeField', 'DecimalField', 'DurationField',
'EmailField', 'Empty', 'Field', 'FieldDoesNotExist', 'FilePathField',
'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField',
'NOT_PROVIDED', 'NullBooleanField', 'PositiveIntegerField',
'PositiveSmallIntegerField', 'SlugField', 'SmallIntegerField', 'TextField',
'TimeField', 'URLField', 'UUIDField',
)]
Field 选项(options)
每一个field
都有其特有的参数集,例如CharField
(和它的子类)需要一个max_length
的参数来规定这个field
在数据库表对应列的varchar
的长度。
同样所有的field
也有一些共同的参数集。这些共有的参数集都是可选择的。下面介绍几个经常使用到的参数:
null
如果为True
,Django
将存储空到数据表。缺省为False
。
blank
如果为True
,这个字段允许为空白(blank),缺省为False
。
注意,blank
与null
是不同的,null
是单纯的与数据库相关的而blank
是与有效性相关的。如果一个fiels
定义blank = True
,从有效性上来说将允许存入空白。(空白不等于空,空字符串也是空白,但不为空。所以CharField
与TextField
不建议使用null
,如果使用null
,则它们存在两种“null
”的形式,一个为null
,一个为空字符串)
choices
当需要一个2元祖作为选择时可以使用choices。如果model
中给出了choices,则缺省的form widget
会用一个选择框代替这个二元组。
choices
形式列表如下:
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)
每一个元祖的第一个元素会存入数据库,而第二个元素会显示到form widget
创建的选择框中。
一个model
的例子,可以通过get_FOO_display()
方法获得一个field
的choice
的显示值。(display value
)。例子如下:
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'