1.定义模型
在模型中定义属性,会生成表中的字段。
django根据属性的类型确定以下信息:
- 当前选择的数据库支持字段的类型
- 渲染管理表单时使用的默认html控件
- 在管理站点最低限度的验证
django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列。
属性命名限制
- 不能是python的保留关键字
- 由于django的查询方式,不允许使用连续的下划线
2.定义属性
定义属性时,需要字段类型
字段类型被定义在django.db.models.fields
目录下,为了方便使用,被导入到django.db.models
中
使用方式
1. 导入from django.db import models
2. 通过models.Field创建字段类型的对象,赋值给属性
对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False。
2.1 字段类型
字段类型 | 解释 |
AutoField | 一个根据实际ID自动增长的IntegerField,通常不指定。如果不指定,一个主键字段将自动添加到模型中 |
BooleanField | true/false 字段,此字段的默认表单控制是CheckboxInput |
NullBooleanField | 支持null、true、false三种值 |
CharField(max_length=字符长度) | 字符串,默认的表单样式是 TextInput |
TextField | 大文本字段,一般超过4000使用,默认的表单控件是Textarea |
IntegerField | 整数 |
DecimalField(max_digits=None, decimal_places=None) | 使用python的Decimal实例表示的十进制浮点数。DecimalField.max_digits :位数总数,DecimalField.decimal_places :小数点后的数字位数 |
FloatField | 用Python的float实例来表示的浮点数 |
DateField[auto_now=False, auto_now_add=False]) | 使用Python的datetime.date实例表示的日期。 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false; 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false; 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键; auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果 |
TimeField | 使用Python的datetime.time实例表示的时间,参数同DateField |
DateTimeField | 使用Python的datetime.datetime实例表示的日期和时间,参数同DateField |
FileField | 一个上传文件的字段 |
ImageField | 继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image |
2.2 字段选项
- 通过字段选项,可以实现对字段的约束
- 在字段对象时通过关键字参数指定
- null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
- blank:如果为True,则该字段允许为空白,默认值是 False
- 对比:null是数据库范畴的概念,blank是表单验证证范畴的
- db_column:字段的名称,如果未指定,则使用属性的名称
- db_index:若值为 True, 则在表中会为此字段创建索引
- default:默认值
- primary_key:若为 True, 则该字段会成为模型的主键字段
- unique:如果为 True, 这个字段在表中必须有唯一值
2.3 关系
关系的类型包括
- ForeignKey:一对多,将字段定义在多的端中
- ManyToManyField:多对多,将字段定义在两端中
- OneToOneField:一对一,将字段定义在任意一端中
可以维护递归的关联关系,使用’self’指定,详见“自关联”
用一访问多:对象.模型类小写_set
bookinfo.heroinfo_set
用一访问一:对象.模型类小写
heroinfo.bookinfo
访问id:对象.属性_id
heroinfo.book_id
3.元选项
1.在模型类中定义类Meta,用于设置元信息
2.元信息db_table:定义数据表名称,推荐使用小写字母,数据表的默认名称
<app_name>_<model_name>
3.ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
class BookInfo(models.Model): ... class Meta(): ordering = ['id']
4.字符串前加-表示倒序,不加-表示正序
class BookInfo(models.Model): ... class Meta(): ordering = ['-id']
排序会增加数据库的开销
4.示例演示
创建test2项目,并创建booktest应用,使用mysql数据库
1.定义图书模型:
class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField() bread = models.IntegerField(default=0) bcommet = models.IntegerField(default=0) isDelete = models.BooleanField(default=False)
2.定义英雄模型:
class HeroInfo(models.Model): hname = models.CharField(max_length=20) hgender = models.BooleanField(default=True) isDelete = models.BooleanField(default=False) hcontent = models.CharField(max_length=100) hbook = models.ForeignKey('BookInfo')
3.定义index、detail视图
4.index.html、detail.html模板
5.配置url,能够完成图书及英雄的展示
5.测试数据
模型BookInfo的测试数据
insert into booktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete) values ('射雕英雄传','1980-5-1',12,34,0), ('天龙八部','1986-7-24',36,40,0), ('笑傲江湖','1995-12-24',20,80,0), ('雪山飞狐','1987-11-11',58,24,0)
模型HeroInfo的测试数据
insert into booktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values ('郭靖',1,1,'降龙十八掌',0), ('黄蓉',0,1,'打狗棍法',0), ('黄药师',1,1,'弹指神通',0), ('欧阳锋',1,1,'蛤蟆功',0), ('梅超风',0,1,'九阴白骨爪',0), ('乔峰',1,2,'降龙十八掌',0), ('段誉',1,2,'六脉神剑',0), ('虚竹',1,2,'天山六阳掌',0), ('王语嫣',0,2,'神仙姐姐',0), ('令狐冲',1,3,'独孤九剑',0), ('任盈盈',0,3,'弹琴',0), ('岳不群',1,3,'华山剑法',0), ('东方不败',0,3,'葵花宝典',0), ('胡斐',1,4,'胡家刀法',0), ('苗若兰',0,4,'黄衣',0), ('程灵素',0,4,'医术',0), ('袁紫衣',0,4,'六合拳',0)