13. Django 2.1.7 模型类 - 字段类型_Python

上一篇Django 2.1.7 模型 - 使用mysql数据库连接访问讲述了如何使用mysql作为数据库,执行模型查询数据,并返回渲染页面。

本篇章开始将继续看看模型类还可以设置哪些字段类型

参考文献

https://docs.djangoproject.com/zh-hans/2.1/ref/models/fields/

前面篇章设置好的两个模型类

13. Django 2.1.7 模型类 - 字段类型_Python_02
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)

对于模型类的字段类型,还有很多字段类型没有在这两个模型体现出现。下面先来认识一下概念。

在官方文档中,关于字段类型的描述非常多,如下:

13. Django 2.1.7 模型类 - 字段类型_Python_03

模型字段的定义属性

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。

编写模型类演示

有了上面关于字段类型的相关说明,下面来丰富一下我这边编写的模型类字段属性,如下:

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) # 逻辑删除

添加了模型中的字段类型之后,执行数据迁移进行变更。

python3 manage.py makemigrations
python3 manage.py migrate

返回mysql查看数据迁移后的表,如下:

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>

可以看到已有数据在迁移的过程我选择了输入当前时间。