一、Model的作用
在Django的框架设计中采用了MVT模型,即Model,Viewer,Template
Model相对于MVC框架来说就相当对数据处理层,它主要负责与数据的交互,在使用Django框架设计应用系统时,需要注意的是Django默认采用的是ORM框架中的codefirst模型,即面向对象的开发方式(如Hibernate),也就是说开发人员只需要专注于代码的编写,而不需要过多的关注数据库层面的东西,把开发人员从数据库中解放出来
二、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目录下,字段类型包含如下:
2.2、字段参数
通过字段参数,可以实现对字段的约束
2.3、表级关系
如Hibernate,表级关系如下:
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的自定义的需求来自于两点:
三、生成迁移文件
迁移文件的概念如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