一、Model的作用
在Django的框架设计中采用了MVT模型,即Model,Viewer,Template
Model相对于MVC框架来说就相当对数据处理层,它主要负责与数据的交互,在使用Django框架设计应用系统时,需要注意的是Django默认采用的是ORM框架中的codefirst模型,即面向对象的开发方式(如Hibernate),也就是说开发人员只需要专注于代码的编写,而不需要过多的关注数据库层面的东西,把开发人员从数据库中解放出来
Django会根据Model类生成一个数据库镜像文件,然后再使用该镜像文件生成数据库,同时该文件将记录与数据库同步版本的变化,所以在使用Django进行开发时不要手工去修改数据库,这样会造成Django框架的版本记录不正确,从而无法正确的同步数据模型与数据库的内容
二、Model的创建
创建项目完成后,会生成settings.py文件,用于配置项目相关信息,此处可以修改数据库配置,本例使用mysql数据库
创建应用完成后,会生成models.py文件,此处用于创建Model,如下:
from django.db import models # 定义模型 class BookInfo(models.Model): btitle = models.CharField(max_length=20) bput_date = models.DateTimeField(db_column='pub_date') bread = models.IntegerField(default=0) bcommet = models.IntegerField(null=False) isDelete = models.BooleanField(default=False) # 定义模型 class HeroInfo(models.Model): hname = models.CharField(max_length=10) hgender = models.BooleanField(default=True) hcontent = models.CharField(max_length=1000) isDelete = models.BooleanField(default=False) hBook = models.ForeignKey(BookInfo, on_delete=models.CASCADE)
2.1、Model字段类型
字段类型被定义在django.db.models.fields目录下,字段类型包含如下:
- AutoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中
- BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
- NullBooleanField:支持null、true、false三种值
- CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
- TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
- IntegerField:整数
- FloatField:用Python的float实例来表示的浮点数
- TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
- DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
- FileField:一个上传文件的字段
- ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
- DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
- DecimalField.max_digits:位数总数
- DecimalField.decimal_places:小数点后的数字位数
- 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 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
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、表级关系
如Hibernate,表级关系如下:
- ForeignKey:一对多,将字段定义在多的端中
- ManyToManyField:多对多,将字段定义在两端中
- OneToOneField:一对一,将字段定义在任意一端中
2.4、元选项
Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。代码如下:
# 定义模型 class BookInfo(models.Model): btitle = models.CharField(max_length=20) bput_date = models.DateTimeField(db_column='pub_date') bread = models.IntegerField(default=0) bcommet = models.IntegerField(null=False) isDelete = models.BooleanField(default=False) class Meta: db_table = 'bookinfo', verbose_name = '图书信息'元选项的配置详解请参阅: Python3 --- Django元选项详解
2.5、管理器
管理器是Django的模型进行数据库的查询操作的接口,Django应用的每个模型都拥有至少一个管理器,Django提供了默认的管理器是models.Manager,我们通过继承的方式自定义管理器,如下:
# 自定义管理器 class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager,self).get_queryset().filter(isDelete=False) def create(self,btitle,bput_date): b = BookInfo() b.btitle = btitle b.bput_date = bput_date b.bread = 0 b.bcommet = False b.isDelete = False return b # 定义模型 class BookInfo(models.Model): btitle = models.CharField(max_length=20) bput_date = models.DateTimeField(db_column='pub_date') bread = models.IntegerField(default=0) bcommet = models.IntegerField(null=False) isDelete = models.BooleanField(default=False) class Meta: db_table = 'bookinfo', verbose_name = '图书信息' books1 = models.Manager() books2 = BookInfoManager() @classmethod def create(self, btitle, bput_date): b = BookInfo() b.btitle = btitle b.bput_date = bput_date b.bread = 0 b.bcommet = False b.isDelete = False return b
通常产生对manager的自定义的需求来自于两点:
- 需要扩展或者修改Django的manager方法。
- 需要修改返回的QuerySet。
三、生成迁移文件
迁移文件的概念如Hibernate的映射文件,用于指定模型类与数据库之间的映射关系,生成迁移文件命令如下:
python manage.py makemigrations
迁移文件被生成到应用的migrations目录,如下是migrations目录中内容:
迁移文件生成时,会生成0001_initial.py文件,后续文件为修改的日志记录文件,0001_initial.py迁移文件内容如下:
from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='BookInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('btitle', models.CharField(max_length=20)), ('bput_date', models.DateTimeField(db_column='pub_date')), ('bread', models.IntegerField(default=0)), ('bcommet', models.IntegerField()), ('isDelete', models.BooleanField(default=False)), ], options={ 'db_table': 'bookinfo', }, ), migrations.CreateModel( name='HeroInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('hname', models.CharField(max_length=10)), ('hgender', models.BooleanField(default=True)), ('hcontent', models.CharField(max_length=1000)), ('isDelete', models.BooleanField(default=False)), ('hBook', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='booktest.BookInfo')), ], options={ 'db_table': 'heroinfo', }, ), ]注意:使用Django进行开发时不要手工去修改数据库,这样会造成Django框架的版本记录不正确,从而无法正确的同步数据模型与数据库的内容
四、执行迁移文件
执行迁移文件,即通过迁移文件生成对应的数据库表信息,如下:
python manage.py migrate