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

2022-01-17 10:01:00 浏览数 (1)

上一篇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的查询方式决定的。
  • 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
代码语言:javascript复制
属性=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>

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

0 人点赞