Models的面向对象
django中的数据库模块提供了一个非常不错的功能,就是支持models的面向对象,可以在models中添加Meta,指定是否抽象,然后进行继承
class Animal(models.Model):
xxx
class Meta:
abstract = True/False
class Dog(Animal):
xxx
实践:模板继承
新建MODELS
CAT和Dog都是继承Animal
# 新建类Animal
class Animal(models.Model):
a_name = models.CharField(max_length=16)
class Cat(Animal):
c_eat = models.CharField(max_length=32)
class Dog(Animal):
d_legs = models.IntegerField(default=4)
迁移数据
我们观察到,迁移生成了三张表,在dog,和cat表都生成了animal_ptr_id
我们观察DDL
可以看到字段animal_ptr_id既是主键又是外键,这样就和two_animal形成了一对一的映射关系。
新建url:
url('^addcat/', views.add_cat, name='add_cat'),
url('^adddog/', views.add_dog, name='add_dog'),
views:
def add_cat(request):
cat = Cat()
cat.name = 'tom'
cat.c_eat = 'fish'
cat.save()
return HttpResponse('cat创建成功 %d' % cat.id)
def add_dog(request):
dog = Dog()
dog.name = 'tom'
dog.save()
return HttpResponse('dog创建成功 %d' % dog.id)
小技巧shift+f6可以统一修改类中的名字
接着我们访问网页添加dog和cat
cat表
dog表
animal表
我们发现dog和cat表都是级联animal表,这就导致一旦数据庞大,animal表查找速度就会受到影响,(关系型数据库因为查表时候涉及到表与表之间的关系,所以才导致了运行效率慢)
解决办法:添加元信息
我们将之前迁移文件,新建animal,dog,cat的migrations表记录,以及生成的animal,cat,dog表都删除
重新迁移
发现,只生成了两张表,并且这两张表通过,abstract抽象,与类animal没有明显的关系,id也是各自分开存放,没有像之前那样合并在一起存放,不会产生级联表
模型继承
- Django中模型支持继承
默认继承是会将通用字段放到父表中,特定字段放在自己的表中,中间使用外键连接
默认继承不好
- 关系型数据库关系越复杂,效率越低,查询越慢
- 父类表中也会存储过多的数据
使用元信息来解决这个问题
- 使模型抽象化
- 抽象的模型就不会在数据库中产生映射了
- 子模型映射出来的表直接包含父模型的字段
在企业中开发中
- model -> sql
- 我们之前学习的都是先建立,模型然后生成sql语句
sql -> model
- django也提供了很好的支持
- python manage.py inspectdb
- 可以直接根据表生成模型
- 元信息中包含一个属性 manage=False,表名了这个模型不会被迁移模型管理
- 如果自己的模型不想被迁移系统管理,也可以使用 manage=False进行声明
实践:sql->model型开发
有的项目不用django开发的,会先把表定下来,接着定model,django其实也提供了支持。
连接mysql
创建数据库
mysql> create database SQLTOModel charset=utf8;
mysql> use SQLToModel;
mysql> create table Book( id int auto_increment primary key,b_name varchar(16));
接着我们创建新的工程
配置好settings后
我们逆向用数据库生成模型,指令如下:python manage.py inspectdb
我们可以看到,自动生成了建表语句。
我们也可以直接生成models.py
将App中原本自带的models.py删除,然后输入:python manage.py inspectdb > App/models.py
我们可以看到成功生成模型。
至此我们的MTV学习已经差不多了,暂告一段落。
此处评论已关闭