一 、 在Django中创建模型
在前面的章节中我们提到过,模型对应的就是数据库中的表,创建好模型后,通过模型迁移,在数据库中创建对应的表。
1.1 继承自models类
首先模型类是被定义在"应用/models.py"文件中的,其次模型类必须基础自django.db.models类:
from django.db import models
1.2 表名
通过以下代码指定数据库表名:
class Meta:
# 指定表名
db_table = 'book_info'
verbose_name = '图书'
如果在模型类中未指定表名,Django默认以"小写app应用名_小写模型类名"为数据库表名。
1.3 主键
Django会自动为生成的表创建一个自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,Django不会再自动创建主键列。
1.4 属性命名控制
通过以下代码创建一个BookInfo(书籍)模型和PersonInfo(书中角色)模型:
# Create your models here.
class BookInfo(models.Model):
# 属性名 = 属性类型 CharField 必须设置max_length
title = models.CharField(max_length=100,verbose_name='书名')
author = models.CharField(max_length=100,verbose_name='作者')
publisher = models.CharField(max_length=100,verbose_name='出版社')
published = models.DateTimeField(verbose_name='发布日期',null=True)
pages = models.IntegerField(default=0 , verbose_name='页数')
readcount = models.IntegerField(default=0 ,verbose_name='阅读量')
commentcount = models.IntegerField(default=0 ,verbose_name='评论量')
class Meta:
db_table = 'book_info'
verbose_name = '图书'
def __str__(self):
"""定义每个数据对象显示信息"""
return self.name
# 书中角色
class PersonInfo(models.Model):
GENDER_CHOICES = (
(0,'male'),(1,'female'),(2,'other')
)
name = models.CharField(max_length= 20 , verbose_name='姓名')
gender = models.SmallIntegerField(choices=GENDER_CHOICES,default=0 ,verbose_name='性别')
description = models.CharField(max_length=200,null=True,verbose_name='描述信息')
# 外键
book = models.ForeignKey(BookInfo,on_delete=models.CASCADE,verbose_name='图书')
is_delete = models.BooleanField(default=False,verbose_name='逻辑删除')
class Meta:
db_table = 'person_info'
verbose_name = '人物信息'
def __str__(self):
return self.name
在前面的章节中,我们提到过,模型对应的是数据库中的表,而属性对应的就是表中的字段。 例如 :在BookInfo模型中,我们创建了title、author、publisher等字段,对应的就是表中一个个的字段。 定义属性时,使用下面的语法:
属性名 = models.字段类型(选项)
字段类型有以下几种:
- AutoField : 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
- BooleanField : 布尔字段,True/False
- NullBooleanField : 支持Null、True、False
- CharField: 字符串,参数max_length表示最大字符个数
- TextField:大文本字段,一般超过4000个字符串时使用
- IntegerField : 整数
- DecimalField : 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
- FloatField : 浮点数
- DateField : 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
- TimeField :时间,参数同DateField
- **DateTimeField ** : 日期时间,参数同DateField
- FileField : 上传文件字段
- ImageField : 继承于FileField,对上传的内容进行校验,确保是有效的图片
选项有以下几种 :
- null : 为True表示允许为空,默认值为False
- blank :为True表示允许为空白,默认值为False
- db_cloumn : 字段名称,如果未指定,使用属性名称
- db_index : 为True在表中为此字段创建索引,默认值为False
- default : 默认
- primary_key : 为True,则该字段会成为模型的主键,默认值为False,一般作为AutoField的选项使用
- unique : 为True表明该字段在表中必须有唯一值,默认值是False
1.5 外键
设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,有下面三种常量分别代表了三种处理方式 :
- CASCADE级联,删除主表数据时连通一起删除外键表中数据
- PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
- SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
- SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
- SET() 设置为特定值或者调用特定方法
- DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常
二、迁移
创建了模型后,就需要使用命令迁移了,在上一章中已经介绍过了:
- 生成迁移文件,这一步不会创建表
python manage.py makemigrations
- 在数据库中创建表
python manage.py migrate