Django 2.1.7 模型类 - 字段类型

网友投稿 361 2022-09-23

Django 2.1.7 模型类 - 字段类型

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

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

参考文献

​​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# 中间件所属服务器:serverclass 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。

编写模型类演示

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

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 makemigrationspython3 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>

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:钟美美&刘天池:年少成名,未必是件坏事!
下一篇:Django 2.1.7 模型的关联
相关文章

 发表评论

暂时没有评论,来抢沙发吧~