上一篇Django 2.1.7 模型 - 使用mysql数据库连接访问讲述了如何使用mysql作为数据库,执行模型查询数据,并返回渲染页面。
本篇章开始将继续看看模型类还可以设置哪些字段类型
参考文献
https://docs.djangoproject.com/zh-hans/2.1/ref/models/fields/
前面篇章设置好的两个模型类
代码语言:javascript复制class ServerInfo(models.Model):
server_hostname = models.CharField(max_length=20, default=None)
server_intranet_ip = models.CharField(max_length=20, default=None)
server_internet_ip = models.CharField(max_length=20, default=None)
server_shelves_date = models.DateField(auto_now_add=True)
# 中间件类:MiddlewareInfo
# 中间件名称: name
# 中间件端口号:port
# 中间件所属服务器:server
class MiddlewareInfo(models.Model):
name = models.CharField(max_length=20)
port = models.IntegerField()
server = models.ForeignKey('ServerInfo',on_delete=models.CASCADE, default=None)
对于模型类的字段类型,还有很多字段类型没有在这两个模型体现出现。下面先来认识一下概念。
在官方文档中,关于字段类型的描述非常多,如下:
模型字段的定义属性
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
注意:pk是主键的别名,若主键名为id2,那么pk是id2的别名。 ”
属性命名限制:
- 不能是python的保留关键字。
- 不允许使用连续的下划线,这是由django的查询方式决定的。
- 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=models.字段类型(选项)
字段类型
使用时需要引入django.db.models包,字段类型如下:
- AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
- BooleanField:布尔字段,值为True或False。
- NullBooleanField:支持Null、True、False三种值。
- CharField(max_length=字符长度):字符串。
- TextField:大文本字段,一般超过4000个字符时使用。
- IntegerField:整数。
- DecimalField(max_digits=None, decimal_places=None):十进制浮点数。专门用于记录金额。
- 参数max_digits表示总位数。
- 参数decimal_places表示小数位数。
- FloatField:浮点数。
- DateField[auto_now=False, auto_now_add=False]):日期。
- 参数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。
- 对比:null是数据库范畴的概念,blank是表单验证范畴的。
- db_column:字段的名称,如果未指定,则使用属性的名称。
- db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
- default:默认值。
- primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
- unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
编写模型类演示
有了上面关于字段类型的相关说明,下面来丰富一下我这边编写的模型类字段属性,如下:
代码语言:javascript复制class ServerInfo(models.Model):
server_hostname = models.CharField(max_length=20, default=None)
server_intranet_ip = models.CharField(max_length=20, default=None)
server_internet_ip = models.CharField(max_length=20, default=None)
server_shelves_date = models.DateField(auto_now_add=True) # 数据加入时间
update_time = models.DateTimeField(auto_now=True) # 数据更新时间
is_delete = models.BooleanField(default=False) # 逻辑删除
class MiddlewareInfo(models.Model):
name = models.CharField(max_length=20)
port = models.IntegerField()
server = models.ForeignKey('ServerInfo',on_delete=models.CASCADE, default=None)
shelves_date = models.DateTimeField(auto_now_add=True) # 数据加入时间
update_time = models.DateTimeField(auto_now=True) # 数据更新时间
is_delete = models.BooleanField(default=False) # 逻辑删除
class ScriptInfo(models.Model):
script_name = models.CharField(max_length=20,default=None) # 脚本名称
script_path = models.CharField(max_length=64,default=None) # 脚本路径
add_user_id = models.IntegerField() # 添加用户的userid
shelves_date = models.DateTimeField(auto_now_add=True) # 数据加入时间
update_time = models.DateTimeField(auto_now=True) # 数据更新时间
is_delete = models.BooleanField(default=False) # 逻辑删除
添加了模型中的字段类型之后,执行数据迁移进行变更。
代码语言:javascript复制python3 manage.py makemigrations
python3 manage.py migrate
返回mysql查看数据迁移后的表,如下:
代码语言:javascript复制mysql> show tables;
----------------------------
| Tables_in_assetinfo |
----------------------------
| assetinfo_middlewareinfo |
| assetinfo_scriptinfo |
| assetinfo_serverinfo |
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
----------------------------
13 rows in set (0.00 sec)
mysql>
mysql> desc assetinfo_serverinfo;
--------------------- ------------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
--------------------- ------------- ------ ----- --------- ----------------
| id | int(11) | NO | PRI | NULL | auto_increment |
| server_hostname | varchar(20) | NO | | NULL | |
| server_intranet_ip | varchar(20) | NO | | NULL | |
| server_internet_ip | varchar(20) | NO | | NULL | |
| server_shelves_date | date | NO | | NULL | |
| is_delete | tinyint(1) | NO | | NULL | |
| update_time | datetime(6) | NO | | NULL | |
--------------------- ------------- ------ ----- --------- ----------------
7 rows in set (0.00 sec)
mysql>
mysql> desc assetinfo_middlewareinfo;
-------------- ------------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
-------------- ------------- ------ ----- --------- ----------------
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| port | int(11) | NO | | NULL | |
| server_id | int(11) | NO | MUL | NULL | |
| is_delete | tinyint(1) | NO | | NULL | |
| shelves_date | datetime(6) | NO | | NULL | |
| update_time | datetime(6) | NO | | NULL | |
-------------- ------------- ------ ----- --------- ----------------
7 rows in set (0.01 sec)
mysql>
mysql> select * from assetinfo_middlewareinfo;
---- ----------- ------- ----------- ----------- ---------------------------- ----------------------------
| id | name | port | server_id | is_delete | shelves_date | update_time |
---- ----------- ------- ----------- ----------- ---------------------------- ----------------------------
| 1 | memcached | 11211 | 1 | 0 | 2019-06-10 14:56:46.150556 | 2019-06-10 14:56:46.241111 |
| 2 | redis | 6379 | 1 | 0 | 2019-06-10 14:56:46.150556 | 2019-06-10 14:56:46.241111 |
---- ----------- ------- ----------- ----------- ---------------------------- ----------------------------
2 rows in set (0.00 sec)
mysql>
mysql> desc assetinfo_scriptinfo;
-------------- ------------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
-------------- ------------- ------ ----- --------- ----------------
| id | int(11) | NO | PRI | NULL | auto_increment |
| script_name | varchar(20) | NO | | NULL | |
| script_path | varchar(64) | NO | | NULL | |
| add_user_id | int(11) | NO | | NULL | |
| shelves_date | datetime(6) | NO | | NULL | |
| update_time | datetime(6) | NO | | NULL | |
| is_delete | tinyint(1) | NO | | NULL | |
-------------- ------------- ------ ----- --------- ----------------
7 rows in set (0.00 sec)
mysql> select * from assetinfo_scriptinfo;
Empty set (0.00 sec)
mysql>
可以看到已有数据在迁移的过程我选择了输入当前时间。