Python Django模型详解
django模型
django的模型定义在models.py文件中。模型是mvt中的m,也相当于mvc中的m。
在django中,模型必须继承自model类。例如:
from django.db import models # create your models here. class bookinfo(models.model): # 一个模型类就会对应生成数据库中的一张表 """书籍模型""" name = models.charfield(max_length=128, verbose_name='名称') # 类的属性就是数据表中的字段。 pub_date = models.datefield(verbose_name='发布日期',null=true) readcount = models.integerfield(default=0, verbose_name='阅读量') commentcount = models.integerfield(default=0, verbose_name='评论量') is_delete = models.booleanfield(default=false, verbose_name='逻辑删除') class meta: # class meta是固定写法 db_table = 'bookinfo' # 指明数据库表名 verbose_name = '图书' # 在admin站点中显示的名称
注意
1.模型类如果未指明表名,django默认以小写app应用名_小写模型类名为数据库表名,一般我们会通过db_table指明数据库表名。
2.django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。默认创建的主键列属性为id,也可以使用pk,意为primary key.
3.字段名称中不能出现双下划线,因为这是django的查询语法之一。
自django3.2后,可以在settings.py中配置default_auto_field参数来设置主键的数据类型,默认是default_auto_field = ‘django.db.models.bigautofield',在django3.2之前,默认生成的主键数据类型是autofield.
下面是django中常用的字段类型的详情
字段类型
类型 | 说明 |
---|---|
bigautofield | 自动增长的bigintegerfield,通常不用指定,不指定时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_column | 字段的名称,如果未指定,则使用属性的名称 |
db_index | 若值为true, 则在表中会为此字段创建索引,默认值是false |
default | 为字段指定默认值 |
primary_key | 若为true,则该字段会成为模型的主键字段,默认值是false,一般作为autofield的选项使用 |
unique | 如果为true, 这个字段在表中必须有唯一值,默认值是false |
choices | 该参数是从一系列的二元组中提供选项 |
注意
1.charfield字段必须要指定参数max_length
2.还可以为字段指定参数verbose_name,这个参数主要是用来在admin管理页面使用,其实是和本地化有关的。例如可以在上面的name字段指定参数verbose_name=“书籍名称”,那么在admin管理页面就会看到书籍名称。
3.null参数是数据库层面的,设置null=true之后,表示数据库的该字段可以为空;blank参数是表单层面(html),blank=true之后,表示表单填写该字段的时候可以不填。
外键
外键这个东西,通常都是在业务逻辑层面来实现的,而不是在数据库中实现。但是通常大家学习的数据库课程中,都会有数据库设计范式,其中有个第三范式就是专指的外键约束。在这里只是简单的介绍一下。下面是另外一个模型,和前面的bookinfo模型通过外键关联起来。
class peopleinfo(models.model): """人员模型""" gender_choices = ( (0, 'male'), (1, 'female') ) 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 = 'peopleinfo' verbose_name = '人物信息'
下面重点来说一下choices这个参数和models.foreignkey。 choices参数就是从我们定义的二元组(gender_choices)中获取值。二元组的第一个值会储存在数据库中,而第二个值将只会用于在表单中显示。对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 get_foo_display() 方法。例如:获取上面的性别信息,可以使用get_gender_display()方法。 外键:通过使用models.foreignkey来设置外键,foreignkey的第一个参数是要关联的模型类名,第二个参数是on_delete。它的常用值可以如下: cascade级联,删除主表数据时连通一起删除外键表中数据 protect保护,通过抛出protectederror异常,来阻止删除主表中被外键应用的数据 set_null设置为null,仅在该字段null=true允许为null时可用 set_default设置为默认值,仅在该字段设置了默认值时可用 set()设置为特定值或者调用特定方法 do_nothing不做任何操作,如果数据库前置指明级联性,此选项会抛出integrityerror异常
注意:我们在数据库中,设置外键的时候需要制定另一张表中关联的字段,但是在django里并没有指定。这是因为django会默认指定另外一张表的id作为关联字段。如下图所示:
可以看到peopleinfo这张表中的外键名称是book_id
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!