模型
这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
模型是有关您的数据的唯一、明确的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型都映射到单个数据库表。
基础知识:
- 每个模型都是一个 Python 类,它是 继承于django.db.models.Model.
- 模型的每个属性代表一个数据库字段。
1.示例
这个示例模型定义了一个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
模型将创建一个这样的数据库表:
CREATE TABLE app_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
复制代码
说明:
-
会在数据库中生成一个 app_person (自己注册的app名),这个数据库名称可以被db_table覆盖
-
db_table = 'test_person' 复制代码
-
-
我们没有创建id字段,但是会帮我们默认加上,但这个id也可以被覆盖
-
id = models.BigAutoField(primary_key=True) 复制代码
-
2.使用模型
我们在定义好模型类后,就要对它进行迁移,到数据库
python manage.py makemigrations # 生成迁移文件,都放在migrations中,
python manage.py migrate # 迁移,迁移成功会在数据库中有记录
复制代码
注意:
如果我们没有在settings.py中的INSTALLED_APPS进行注册的话,就不会对其进行迁移。使用一定不要忘了
INSTALLED_APPS = [
...
'app', # 自己使用startapp注册的
...
]
复制代码
3.字段类型
下表列出了所有Django内置的字段类型,但不包括关系字段类型(字段名采用驼峰命名法,初学者请一定要注意):
类型 | 说明 |
---|---|
AutoField | 一个自动增加的整数类型字段。通常你不需要自己编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True) ,这是一个自增字段,从1开始计数。如果你非要自己设置主键,那么请务必将字段设置为primary_key=True 。Django在一个模型中只允许有一个自增字段,并且该字段必须为主键! |
BigAutoField | 64位整数类型自增字段,数字范围更大,从1到9223372036854775807 |
BigIntegerField | 64位整数字段(看清楚,非自增),类似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表单里体现为一个NumberInput 标签。 |
BinaryField | 存储原始二进制数据的字段。 |
BooleanField | 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。如果设置了参数null=True,则表现为NullBooleanSelect选择框。可以提供default参数值,设置默认值。 |
CharField | 最常用的类型,字符串类型。必须接收一个max_length参数,表示字符串长度不能超过该值。默认的表单标签是text input。 |
DateField | auto_now:保存对象时自动将字段设置为现在(当前时间) auto_now_add:首次创建对象时自动将字段设置为现在。用于创建时间戳 |
DateTimeField | 日期和时间,在 Python 中由datetime.datetime 实例表示。 |
DecimalField | 一个固定精度的十进制数,在 Python 中由一个 Decimal 实例表示。有两个必需的参数 |
DurationField | 用于存储时间段的字段 |
EmailField | 使用CharField 来检查该值是否为有效电子邮件地址 |
FileField | 文件上传字段。 |
FilePathField | 文件路径类型,后面单独介绍 |
FloatField | 浮点数类型,对应Python的float。参考整数类型字段。 |
ImageField | 图像类型,后面单独介绍。 |
IntegerField | 整数类型,最常用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput或者TextInput标签。 |
GenericIPAddressField | class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options) ,IPV4或者IPV6地址,字符串形式,例如192.0.2.30 或者2a02:42fe::4 。在HTML中表现为TextInput标签。参数protocol 默认值为‘both’,可选‘IPv4’或者‘IPv6’,表示你的IP地址类型。 |
JSONField | JSON类型字段。Django3.1新增。签名为class JSONField(encoder=None,decoder=None,**options) 。其中的encoder和decoder为可选的编码器和解码器,用于自定义编码和解码方式。如果为该字段提供default值,请务必保证该值是个不可变的对象,比如字符串对象。 |
PositiveBigIntegerField | 正的大整数,0到9223372036854775807 |
PositiveIntegerField | 正整数,从0到2147483647 |
PositiveSmallIntegerField | 较小的正整数,从0到32767 |
SlugField | slug是一个新闻行业的术语。一个slug就是一个某种东西的简短标签,包含字母、数字、下划线或者连接线,通常用于URLs中。可以设置max_length参数,默认为50。 |
SmallAutoField | Django3.0新增。类似AutoField,但是只允许1到32767。 |
SmallIntegerField | 小整数,包含-32768到32767。 |
TextField | 用于储存大量的文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!如果你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。只有CharField才能同时作用于两者。 |
TimeField | 时间字段,Python中datetime.time的实例。接收同DateField一样的参数,只作用于小时、分和秒。 |
URLField | 一个用于保存URL地址的字符串类型,默认最大长度200。 |
UUIDField | 用于保存通用唯一识别码(Universally Unique Identifier)的字段。使用Python的UUID类。在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是自增主键的最佳替代品,后面有例子展示。 |
4.关系字段
ForeignKey | 一对多 |
---|---|
OneToOneField | 一对一 |
ManyToManyField | 多对多 |
5.字段选项
null | 如果True,可以存储空值。默认为False。 |
---|---|
blank | 如果True,则允许该字段为空。默认为False(True表单验证将允许输入空值) |
choices | CHOICES = [ ('SR', 'Senior'), ('GR', 'Graduate'), ] 每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是可读的名称 |
db_column | 用于此字段的数据库列的名称。如果没有给出, 将使用该字段的名称。 |
db_index | 如果True ,将为此字段创建数据库索引。 |
db_tablespace | 用于此字段索引的[数据库表空间的名称(如果此字段已编入索引)。默认值是项目的 `DEFAULT_INDEX_TABLESPACE设置(如果已设置)或 db_tablespace模型的设置(如果有)。如果后端不支持索引表空间,则忽略此选项。 |
default | 字段的默认值 |
editable | 如果是False ,该字段将不会 ModelForm中。在模型验证期间它们也会被跳过。默认为True 。 |
error_messages | 该error_messages 参数允许您覆盖该字段将引发的错误默认消息 |
help_text | 与表单小部件一起显示的额外“帮助”文本。即使您的字段未在表单上使用,它也可用于文档。 |
primary_key | 如果True ,则该字段是模型的主键 |
unique | 如果True ,则该字段在整个表中必须是唯一的。 |
verbose_name | 字段的可读名称。如果没有给出详细名称,Django 将使用字段的属性名称自动创建它,将下划线转换为空格 |
\